Imports DigitalData.GUIs.Common Imports DigitalData.Modules.Base Imports DigitalData.Modules.Logging Imports DigitalData.Modules.ZooFlow Imports System.Threading.Tasks Public Class SearchRunner Inherits BaseClass Private Const SEARCH_FACT_DATE_DEFAULT As String = "ADDED_WHEN" Public Const CREATED_TOMORROW As String = "TOMORROW" Public Const CREATED_TODAY As String = "ECM_CREATED_TODAY" Public Const CREATED_YESTERDAY As String = "ECM_CREATED_YESTERDAY" Public Const CREATED_LAST_7_DAYS As String = "ECM_CREATED_LAST7DAYS" Public Const CREATED_YEAR_CURRENT As String = "ECM_CREATED_YEAR_CURRENT" Public Const CREATED_YEAR_LAST As String = "ECM_CREATED_YEAR_LAST" Public Const CREATED_MONTH_CURR As String = "ECM_CREATED_MONTH_CURRENT" Public Const CREATED_MONTH_LAST As String = "ECM_CREATED_MONTH_LAST" Public Enum DateConstraint Today Tomorrow Yesterday Last7Days CurrentMonth LastMonth CurrentYear LastYear Undefined End Enum Public Enum TokenOperator [And] [Or] End Enum Public Event NeedsRefresh As EventHandler(Of Integer) Public Event Closed As EventHandler(Of Integer) Private Property _ActiveDateConstraint As String = String.Empty Public ReadOnly Property ActiveDateConstraint As String Get Return _ActiveDateConstraint End Get End Property Private _ActiveDateAttribute As String = SEARCH_FACT_DATE_DEFAULT Private _ActiveTokenOperator As TokenOperator = TokenOperator.And Public ReadOnly Property ActiveDateAttribute As String Get Return _ActiveDateAttribute End Get End Property Public Property BaseSearchSQL As String Public Property ExplicitDate As Boolean = False Private ReadOnly Environment As Environment Private ReadOnly SearchId As String Private ReadOnly UserId As Integer Private ReadOnly UserLanguage As String Public Sub New(pLogConfig As LogConfig, pEnvironment As Environment, pSearchId As String) MyBase.New(pLogConfig) Environment = pEnvironment SearchId = pSearchId UserId = My.Application.User.UserId UserLanguage = My.Application.User.Language End Sub Public Function RunWithDataTable(pDatatable As DataTable) As SearchResult Return RunWithDataTable(pDatatable, "Suche") End Function Public Function RunWithDataTable(pDatatable As DataTable, pTitle As String) As SearchResult Dim oParams = GetParams(pTitle) oParams.Results.Add(New DocumentResultList.DocumentResult() With { .Title = pTitle, .Datatable = pDatatable }) If pDatatable.Rows.Count = 1 Then oParams.ShowFileList = False End If Dim oForm As New frmDocumentResultList(My.LogConfig, Environment, oParams) ' TODO: Implement, not needed right now 'AddHandler oForm.NeedsRefresh, AddressOf Form_NeedsRefresh AddHandler oForm.FormClosed, AddressOf Form_Closed oForm.Show() Return New SearchResult(pDatatable.Rows.Count) End Function ''' ''' Only search for Term. Used for sidebar quicksearch. ''' Public Async Function RunWithSearchTerm(pSearchTerm As String) As Task(Of SearchResult) Return Await RunWithSearchTerm(New SearchOptions With {.SearchString = pSearchTerm}) End Function Public Async Function RunWithSearchTerm(pSearchTerm As String, pDateFrom As Date, pDateTo As Date, pSearchTitle As String) As Task(Of SearchResult) Return Await RunWithSearchTerm(New SearchOptions With { .SearchString = pSearchTerm, .SearchTitle = pSearchTitle, .DateFrom = pDateFrom, .DateTo = pDateTo }) End Function Public Async Function RunWithTokens(pTokens As IEnumerable(Of Search.SearchToken.Token)) As Task(Of SearchResult) Return Await RunWithSearchTerm(New SearchOptions With { .SearchTokens = pTokens }) End Function Public Async Function RunWithTokens(pTokens As IEnumerable(Of Search.SearchToken.Token), pDateFrom As Date, pDateTo As Date, pSearchTitle As String) As Task(Of SearchResult) If pTokens.Count = 0 And pDateFrom = Date.MinValue And pDateTo = Date.MinValue And _ActiveDateConstraint = String.Empty Then Return New SearchResult(0) End If Return Await RunWithSearchTerm(New SearchOptions With { .SearchTokens = pTokens, .DateFrom = pDateFrom, .DateTo = pDateTo }) End Function 'Public Async Function RunWithSearchTerm(pSearchTerm As String, pDateFrom As Date, pDateTo As Date) As Task(Of SearchResult) ' Return Await RunWithSearchTerm(pSearchTerm, pDateFrom, pDateTo, Nothing, Nothing) 'End Function Private Async Function RunWithSearchTerm(pOptions As SearchOptions) As Task(Of SearchResult) Dim oDateConstraint = Await GetDateConstraint(pOptions.DateFrom, pOptions.DateTo) Dim oWindowTitle = GetResultWindowString(pOptions.SearchString, pOptions.SearchTitle) Dim oParams = GetParams(oWindowTitle) Dim oTokens = pOptions.SearchTokens Dim oSearchTerm = pOptions.SearchString Dim oSQL If oTokens IsNot Nothing AndAlso oTokens.Count > 0 Then Await InsertSearchTokens(oTokens) oSQL = $"EXEC PRIDB_SEARCH_GET_TOKEN_RESULT_DOCS {UserId}, '{oDateConstraint}', '{UserLanguage}'" ElseIf oSearchTerm IsNot Nothing Then oSQL = $"EXEC PRIDB_SEARCH_GET_TEXT_RESULTS {UserId},'{pOptions.SearchString}','{oDateConstraint}', '{UserLanguage}'" Else oSQL = $"EXEC PRIDB_SEARCH_GET_TEXT_RESULTS {UserId},'{String.Empty}','{oDateConstraint}', '{UserLanguage}'" End If If Await My.Database.ExecuteNonQueryIDBAsync(oSQL) = True Then Dim oDTDocResult = Await My.Database.GetDatatableIDBAsync(BaseSearchSQL) If oDTDocResult Is Nothing Then Return New SearchResult("Error in Search Query") End If Dim oRowCount = oDTDocResult.Rows.Count If oRowCount > 0 Then oParams.Results.Add(New DocumentResultList.DocumentResult() With { .Title = SearchId, .Datatable = oDTDocResult }) If oDTDocResult.Rows.Count = 1 Then oParams.ShowFileList = False End If Dim oForm As New frmDocumentResultList(My.LogConfig, Environment, oParams) ' TODO: Implement 'AddHandler oForm.NeedsRefresh, AddressOf Form_NeedsRefresh AddHandler oForm.FormClosed, AddressOf Form_Closed oForm.Show() Return New SearchResult(oRowCount) Else Return New SearchResult(oRowCount) End If Else Return New SearchResult("Error in Search Function") End If End Function Private Async Function GetDateConstraint(pDateFrom As Date, pDateTo As Date) As Task(Of String) Dim oSimpleDateConstraint = $"{_ActiveDateAttribute}~{_ActiveDateConstraint}" Dim oExplicitConstraint = Await MaybeSetExplicitDateConstraint(pDateFrom, pDateTo) If IsNothing(oExplicitConstraint) Then Return oSimpleDateConstraint Else Return oExplicitConstraint End If End Function Private Async Function InsertSearchTokens(pTokens As IEnumerable(Of Search.SearchToken.Token)) As Task Logger.Debug("Deleting previous user tokens..") Await My.Database.ExecuteNonQueryIDBAsync($"DELETE FROM TBIDB_SEARCH_INPUT_USER WHERE USR_ID = {UserId}") If pTokens Is Nothing Then Logger.Warn("Token Object was nothing!") Exit Function End If If pTokens.Count = 0 Then Logger.Warn("Token Object was empty!") Exit Function End If Dim oOperatorString Select Case _ActiveTokenOperator Case TokenOperator.Or oOperatorString = "OR" Case Else oOperatorString = "AND" End Select For Each oToken In pTokens Dim oSQLInsert As String = $" INSERT INTO [dbo].[TBIDB_SEARCH_INPUT_USER] ([USR_ID], [ATTR_ID], [ATTR_TITLE], [TERM_ID], [OPERATOR]) VALUES ({UserId}, {oToken.AttributeId}, '{oToken.AttributeTitle}', {oToken.TermId}, '{oOperatorString}')" Dim oResult = Await My.Database.ExecuteNonQueryIDBAsync(oSQLInsert) Logger.Warn("Inserting Tokens failed!") Next End Function Private Async Function MaybeSetExplicitDateConstraint(pDateFrom As Date, pDateTo As Date) As Task(Of String) If pDateFrom.Equals(Date.MinValue) = False Then ExplicitDate = True Dim oDateTo As Date If pDateTo.Equals(Date.MinValue) Then oDateTo = pDateFrom Else oDateTo = pDateTo End If Dim oProc = $"EXEC PRIDB_SEARCH_ADD_USR_DATE {UserId},'{pDateFrom}','{oDateTo}'" If Await My.Database.ExecuteNonQueryIDBAsync(oProc) = True Then Return $"{_ActiveDateAttribute}~DATEPART" Else Return Nothing End If End If Return Nothing End Function Private Sub Form_Closed(sender As Object, e As EventArgs) RaiseEvent Closed(sender, 0) End Sub Private Function GetParams(pWindowTitle As String) As DocumentResultList.Params Dim oParams = New DocumentResultList.Params() With { .WindowGuid = SearchId, .WindowTitle = pWindowTitle, .OperationModeOverride = Modules.ZooFlow.Constants.OperationMode.ZooFlow, .ProfileGuid = 35452, .ColumnNames = New DocumentResultList.ColumnNames With { .ObjectIdColumn = "DocID" }, .ShowBackNavigation = False } Return oParams End Function Private Function GetResultWindowString(pSearchContent As String, pWindowTitle As String) As String Dim oWindowString ' This is the default title If UserLanguage = State.UserState.LANG_DE_DE Then oWindowString = $"Suche" Else oWindowString = $"Search" End If ' If a Search String is given, we might take this If pSearchContent <> String.Empty Then If UserLanguage = State.UserState.LANG_DE_DE Then Return $"Suche Nach '{pSearchContent}'" Else Return $"Search For '{pSearchContent}'" End If End If ' Window Title overrides everything If pWindowTitle IsNot Nothing Then oWindowString = pWindowTitle End If Return oWindowString End Function Public Sub SetDateConstraint() _ActiveDateConstraint = String.Empty End Sub Public Sub SetDateConstraint(pConstraintName As String) _ActiveDateConstraint = pConstraintName End Sub Public Sub SetDateConstraint(pConstraint As DateConstraint) _ActiveDateConstraint = DateConstraintToConstant(pConstraint) End Sub Public Sub SetTokenOperator(pOperator As TokenOperator) _ActiveTokenOperator = pOperator End Sub Public Function DateConstraintToConstant(pConstraint As DateConstraint) As String Select Case pConstraint Case DateConstraint.Today Return CREATED_TODAY Case DateConstraint.Yesterday Return CREATED_YESTERDAY Case DateConstraint.Tomorrow Return CREATED_TOMORROW Case DateConstraint.Last7Days Return CREATED_LAST_7_DAYS Case DateConstraint.CurrentMonth Return CREATED_MONTH_CURR Case DateConstraint.LastMonth Return CREATED_MONTH_LAST Case DateConstraint.CurrentYear Return CREATED_YEAR_CURRENT Case DateConstraint.LastYear Return CREATED_YEAR_LAST Case Else Return String.Empty End Select End Function Public Function ConstantToDateConstraint(pConstant As String) As DateConstraint Select Case pConstant Case CREATED_TODAY Return DateConstraint.Today Case CREATED_YESTERDAY Return DateConstraint.Yesterday Case CREATED_TOMORROW Return DateConstraint.Tomorrow Case CREATED_LAST_7_DAYS Return DateConstraint.Last7Days Case CREATED_MONTH_CURR Return DateConstraint.CurrentMonth Case CREATED_MONTH_LAST Return DateConstraint.LastMonth Case CREATED_YEAR_CURRENT Return DateConstraint.CurrentYear Case CREATED_YEAR_LAST Return DateConstraint.LastYear Case Else Return DateConstraint.Undefined End Select End Function Public Sub SetDateAttribute(pAttributeName As String) _ActiveDateAttribute = pAttributeName End Sub Public Sub SetDateAttribute() _ActiveDateAttribute = SEARCH_FACT_DATE_DEFAULT End Sub Public Class SearchOptions Public SearchTitle As String Public SearchString As String Public SearchTokens As IEnumerable(Of Search.SearchToken.Token) Public DateFrom As Date Public DateTo As Date End Class Public Class SearchResult Public OK As Boolean = True Public Count As Integer = 0 Public ErrorMessage As String = String.Empty ''' ''' Returns a positive Search Result ''' Public Sub New(pCountResults As Integer) Count = pCountResults End Sub ''' ''' Returns a failed search result with an error message ''' ''' Public Sub New(pMessage As String) OK = False ErrorMessage = pMessage End Sub End Class End Class