Imports DigitalData.Modules.Database Imports DigitalData.Modules.Logging Imports DigitalData.Modules.Patterns Imports DigitalData.Modules.Language Imports DigitalData.Services.EDMIService.Methods.GetDatatableFromCache Namespace Methods.GlobalIndexer.ImportFile Public Class ImportFileMethod Inherits BaseMethod Private ReadOnly Patterns As Patterns2 Private ReadOnly GetDatatable As GetDatatableFromCacheMethod Private Profile As DataRow Private Const VIEW_PROFILE = "VWGI_DOCTYPE_IDB" Private Const VIEW_INDEX_MANUAL = "VWDDINDEX_MAN" Private Const VIEW_INDEX_AUTOMATIC = "VWDDINDEX_AUTOM" Private Const TABLE_POST_PROCESSING = "TBDD_INDEX_MAN_POSTPROCESSING" Public Sub New(pLogConfig As LogConfig, pMSSQLServer As MSSQLServer, pGlobalState As GlobalState) MyBase.New(pLogConfig, pMSSQLServer, pGlobalState) Patterns = New Patterns2(pLogConfig) GetDatatable = New GetDatatableFromCacheMethod(LogConfig, Database, GlobalState) End Sub ''' ''' ''' ''' ''' ''' ''' ''' Public Function Run(pData As ImportFileRequest) Try ' TODO: Add missing user properties in UserState from TBDD_USER 'pData.User = ResolveUserFromUserName(pData.User.UserName) Dim oManualIndexes = LoadManualIndexes(pData.ProfileId) Dim oAutomaticIndexes = LoadAutomaticIndexes(pData.ProfileId) Dim oPostProcessingSteps As DataTable = LoadPostProcessingSteps(oManualIndexes) LoadProfile(pData.ProfileId) Dim oFinalAttributes = pData.AttributeValues Dim oFileName As String = GetFilenameByNameconvention(pData.File.FileName, Profile.Item("NAMENKONVENTION")) ' Apply post processing Dim oPostProcessing = New Steps.PostProcessing(LogConfig, oPostProcessingSteps) oFinalAttributes = oPostProcessing.ApplyManualPostprocessing(oFinalAttributes) ' Apply automatic attributes Dim oAutomaticIndexing = New Steps.AutomaticIndexing(LogConfig, Database, oAutomaticIndexes, GlobalState) oFinalAttributes = oAutomaticIndexing.ApplyAutomaticeAttributes(oFinalAttributes, pData.File.FileInfoRaw, pData.User) ' Import the file Dim oNewFile As New NewFileMethod(LogConfig, Database, GlobalState) Dim oResponse = oNewFile.Run(New NewFile.NewFileRequest With { .File = pData.File, .BusinessEntity = pData.BusinessEntity, .KindType = pData.KindType, .StoreName = pData.StoreName, .User = pData.User }) If oResponse.OK Then Logger.Info("Import of file [{0}] under ObjectId [{1}] successful!", pData.File.FileName, oResponse.ObjectId) Return New ImportFileResponse(oResponse.ObjectId) Else Throw New ApplicationException(oResponse.ErrorMessage) End If Catch ex As Exception Return New ImportFileResponse(ex) End Try End Function Private Function GetFilenameByNameconvention(pFileName As String, pNameconvention As String) As String Return pFileName End Function ''' ''' Load Profiles for this Import ''' Private Sub LoadProfile(pProfileId As Integer) Logger.Debug("Start of Method [LoadAutomaticIndexes]") Try Dim oProfile = GetDatatable.Run( New GetDatatableFromCacheRequest With { .DataTable = VIEW_PROFILE, .FilterExpression = $"DOCTYPE_ID = {pProfileId}" }) If oProfile.OK = False Then LogAndThrow(oProfile.ErrorMessage) End If Profile = oProfile.Table.Rows.Item(0) Catch ex As Exception LogAndThrow(ex, "Error while automatic loading indexes!") End Try End Sub ''' ''' Load automatic indexes for this Import ''' Private Function LoadAutomaticIndexes(pProfileId As Integer) As List(Of AutomaticIndex) Logger.Debug("Start of Method [LoadAutomaticIndexes]") Try ' Load automatic Indexes for this Import Dim oAutomaticIndexes = GetDatatable.Run( New GetDatatableFromCacheRequest With { .DataTable = VIEW_INDEX_AUTOMATIC, .FilterExpression = $"DOCTYPE_ID = {pProfileId}" }) If oAutomaticIndexes.OK = False Then LogAndThrow(oAutomaticIndexes.ErrorMessage) End If Dim oIndexes As New List(Of AutomaticIndex) For Each oRow As DataRow In oAutomaticIndexes.Table.Rows Dim oAutomaticIndex As New AutomaticIndex With { .Id = oRow.ItemEx(Of Integer)("GUID"), .Name = oRow.ItemEx(Of String)("INDEXNAME"), .ProfileId = oRow.ItemEx(Of Integer)("DOCTYPE_ID"), .SQLCommand = oRow.ItemEx(Of String)("SQL_RESULT"), .SQLConnectionId = oRow.ItemEx(Of Integer)("CONNECTION_ID"), .Sequence = oRow.ItemEx(Of String)("SEQUENCE"), .Value = oRow.ItemEx(Of String)("VALUE") } oIndexes.Add(oAutomaticIndex) Next Logger.Info("[{0}] automatic indexes loaded.", oIndexes) Return oIndexes Catch ex As Exception LogAndThrow(ex, "Error while automatic loading indexes!") End Try End Function ''' ''' Load manual indexes for this Import ''' Private Function LoadManualIndexes(pProfileId As Integer) As List(Of ManualIndex) Logger.Debug("Start of Method [LoadManualIndexes]") Try ' Load manual Indexes for this Import Dim oManualIndexes = GetDatatable.Run( New GetDatatableFromCacheRequest With { .DataTable = VIEW_INDEX_MANUAL, .FilterExpression = $"DOK_ID = {pProfileId}" }) If oManualIndexes.OK = False Then LogAndThrow(oManualIndexes.ErrorMessage) End If Dim oIndexes As New List(Of ManualIndex) For Each oRow As DataRow In oManualIndexes.Table.Rows Dim oManualIndex As New ManualIndex With { .Id = oRow.ItemEx(Of Integer)("GUID"), .Name = oRow.ItemEx(Of String)("INDEXNAME"), .ProfileId = oRow.ItemEx(Of Integer)("DOCTYPE_ID"), .IsOptional = oRow.ItemEx(Of Boolean)("OPTIONAL"), .IsMultiselect = oRow.ItemEx(Of String)("MULTISELECT"), .SQLCommand = oRow.ItemEx(Of String)("SQL_RESULT"), .SQLConnectionId = oRow.ItemEx(Of Integer)("CONNECTION_ID"), .DefaultValue = oRow.ItemEx(Of String)("DEFAULT_VALUE"), .DataType = oRow.ItemEx(Of String)("DATA_TYPE") } oIndexes.Add(oManualIndex) Next Return oIndexes Catch ex As Exception LogAndThrow(ex, "Error while loading indexes!") End Try End Function Private Function LoadPostProcessingSteps(pManualIndexes As List(Of ManualIndex)) As DataTable Logger.Debug("Start of Method [LoadPostProcessingSteps]") Try ' Generate a string containing all index ids joined into a string Dim oIndexIdList As List(Of Integer) = pManualIndexes. Select(Function(index) index.Id). ToList() Dim oIndexIds As String = String.Join(",", oIndexIdList) If oIndexIdList.Count = 0 Then Logger.Debug("No Postprocessing steps found for this profile. Exiting.") Return Nothing End If ' Load all relevant postprocessing steps Dim oPostProcessingSteps = GetDatatable.Run( New GetDatatableFromCacheRequest With { .DataTable = TABLE_POST_PROCESSING, .FilterExpression = $"IDXMAN_ID IN ({oIndexIds})" }) If oPostProcessingSteps.OK = False Then LogAndThrow(oPostProcessingSteps.ErrorMessage) End If Return oPostProcessingSteps.Table Catch ex As Exception LogAndThrow(ex, "Error while loading post processing steps!") End Try End Function End Class End Namespace