Imports System.IO Imports DigitalData.Modules.Database Imports DigitalData.Modules.Logging Imports DigitalData.Modules.Patterns Imports DigitalData.Modules.ZooFlow.State Imports DigitalData.Services.EDMIService.GlobalState Namespace Methods.GlobalIndexer.ImportFile.Steps Public Class AutomaticIndexing Inherits BaseClass Private ReadOnly GlobalState As GlobalState Private ReadOnly AutomaticIndexes As List(Of AutomaticIndex) Private ReadOnly Patterns As Patterns2 Private ReadOnly Database As MSSQLServer Public Sub New(pLogConfig As LogConfig, pDatabase As MSSQLServer, pAutomaticIndexes As List(Of AutomaticIndex), pGlobalState As GlobalState) MyBase.New(pLogConfig) Database = pDatabase GlobalState = pGlobalState AutomaticIndexes = pAutomaticIndexes Patterns = New Patterns2(pLogConfig) End Sub Public Function ApplyAutomaticeAttributes(pManualAttributes As List(Of UserAttributeValue), pFileInfo As FileInfo, pUserState As UserState) As List(Of UserAttributeValue) Logger.Debug("Start of Method [ApplyAutomaticeAttributes]") Dim oAttributes = pManualAttributes For Each oAutomaticIndex In AutomaticIndexes ' We add oAttributes from the previous run into the current run so it is in theory possible to reference ' automatic attributes which have been set just before. Dim oAttribute = ApplyAutomaticIndex(oAutomaticIndex, pFileInfo, pUserState, oAttributes) oAttributes.Add(oAttribute) Next Return oAttributes End Function Private Function ApplyAutomaticIndex(pAutomaticIndex As AutomaticIndex, pFileInfo As FileInfo, pUserState As UserState, pAttributes As List(Of UserAttributeValue)) As UserAttributeValue Dim oAttributeDict = pAttributes.ToDictionary( Function(attr) attr.AttributeName, Function(attr) attr.AttributeValues) ' If there is no SQL command, we use the Value property and replace all placeholders in it. If pAutomaticIndex.HasSqlCommand = False Then Dim oResult As String = GetPlaceholderValue(pAutomaticIndex.Value, pFileInfo, pUserState, oAttributeDict) Return New UserAttributeValue With { .AttributeValues = New List(Of String) From {oResult}, .AttributeName = pAutomaticIndex.Name, .AttributeId = pAutomaticIndex.Id } End If ' Otherwise we will replace placeholders in the SQL command and then execute it Dim oConnectionString As String = GlobalState.GetConnectionString(pAutomaticIndex.SQLConnectionId) Dim oFinalSQLCommand = pAutomaticIndex.SQLCommand oFinalSQLCommand = GetPlaceholderValue(oFinalSQLCommand, pFileInfo, pUserState, oAttributeDict) ' Now we have a SQL command which only contains vector placeholders ' Next, we execute the command to get our result Dim oValue = Database.GetScalarValueWithConnection(oFinalSQLCommand, oConnectionString) ' TODO: Return multiple values Return New UserAttributeValue With { .AttributeValues = New List(Of String) From {oValue}, .AttributeName = pAutomaticIndex.Name, .AttributeId = pAutomaticIndex.Id } End Function Private Function GetPlaceholderValue(pValue As String, pFileInfo As FileInfo, pUserState As UserState, pAttributes As Dictionary(Of String, List(Of String))) As String Dim oResult As String = pValue oResult = Patterns.ReplaceInternalValues(oResult) oResult = Patterns.ReplaceFileValues(oResult, pFileInfo) oResult = Patterns.ReplaceUserValues(oResult, pUserState) oResult = Patterns.ReplaceGlobixValues(oResult, pAttributes) Return oResult End Function End Class End Namespace