Public Class QuerybuilderMarks

    Public Shared Function Build(config As ConfigValues, db As DB)
        Dim mainQuery As String
        Dim companies As List(Of String)
        Dim stringsToIgnore As New List(Of String)

        ' searchvalues ist entweder eine SQL Abfrage oder eine Semikolongetrennte Liste
        If config.query.ToUpper.StartsWith("SELECT") Then
            companies = GetLiveQueryResult(config.query, db)
        Else
            companies = New List(Of String)(config.query.Split(";"))
        End If

        If config.queryIgnore.Count > 0 And config.queryIgnore.Contains(";") Then
            stringsToIgnore = New List(Of String)(config.queryIgnore.Split(";"))
        End If

        mainQuery = BuildMainQuery(companies)
        mainQuery &= BuildIgnoreQuery(stringsToIgnore)

        Return mainQuery
    End Function

    Public Shared Function BuildMainQuery(companies As List(Of String)) As String
        Dim query As String = String.Empty

        For Each company As String In companies
            Dim querypart As String = String.Format("(INH=""{0}"" OR ANM=""{0}"")", company.Trim())

            query &= querypart

            ' Bei allen bis auf das letzte Unternehmen einen OR Operator einfügen
            If (companies.IndexOf(company) + 1) < companies.Count Then
                query &= " OR "
            End If
        Next

        Return query
    End Function

    Public Shared Function BuildIgnoreQuery(stringsToIgnore As List(Of String))
        Dim query As String = String.Empty

        For Each stringToIgnore In stringsToIgnore
            Dim querypart As String = String.Format(" NOT (INH=""{0}"" OR ANM=""{0}"")", stringToIgnore)

            query &= querypart
        Next

        Return query
    End Function

    Public Shared Function GetLiveQueryResult(query As String, db As DB) As List(Of String)
        Dim result As New List(Of String)
        Dim SQL As String = query
        Dim DT As DataTable = db.QueryTable(SQL)

        If DT.Rows.Count = 0 Then
            Throw New Exception("SQL Abfrage lieferte ein leeres Ergebnis zurück: " & query)
        End If

        For Each row As DataRow In DT.Rows
            Dim item As String = CStr(row.Item(0)).Trim()
            result.Add(row.Item(0))
        Next

        Return result
    End Function

End Class
