SourceMetadata: ISourceMetadata;
SourceMetadata: Prognoz.Platform.Interop.BISearch.ISourceMetadata;
Свойство SourceMetadata возвращает метаданные источника данных.
Предполагается, что репозиторий настроен на работу с поисковым сервисом на базе Apache Solr. В базе поискового сервиса имеются индексированные данные о срезах различных источников данных репозитория. Подключите системные сборки: BISearch, Fore, Metabase.
Sub UserProc;
Var
MB: IMetabase;
SharedParams: ISharedParams;
SearchEngine: ISolrSearchEngineService;
Schema: ISolrSearchEngineSchema;
SearchExecutor: ISearchExecutor;
SearchContext: ISolrSourceDataSearchContext;
Results: ISolrSearchResults;
Result: ISearchSourceDataResult;
Source: ISourceMetadata;
Selections: ISearchDimSelectionSet;
Selection: ISearchDimSelection;
Elements: ISearchDimSelectionElements;
Element: ISearchDimSelectionElement;
Calendars: ICalendarInfos;
Calendar: ICalendarInfo;
MDesc: IMetabaseObjectDescriptor;
i, j: Integer;
Begin
MB := MetabaseClass.Active;
//Параметры поиска и индексации, заданные для репозитория
SharedParams := MB.SpecialObject(MetabaseSpecialObject.SharedParams).Bind As ISharedParams;
SearchEngine := SharedParams.SearchEngine As ISolrSearchEngineService;
Schema := SearchEngine.SearchEngineSchema As ISolrSearchEngineSchema;
//Параметры поиска
SearchExecutor := Schema.SearchExecutor(SearchEngineTargetType.SourceData);
SearchContext := SearchExecutor.CreateContext As ISolrSourceDataSearchContext;
SearchContext.Locale := LocaleCodeID.Russian;
SearchContext.Text := "Россия";
//Поиск
Results := SearchExecutor.Search(SearchContext) As ISolrSearchResults;
//Просмотр информации по источнику для первого результата поиска
Result := Results.Item(0) As ISearchSourceDataResult;
Source := Result.SourceMetadata;
Debug.WriteLine("Наименование среза: " + Result.Name);
Debug.WriteLine("Источник: " + Source.SourceName + '(' + Source.SourceId + ')');
Debug.WriteLine("Тип объекта: " + MetabaseClass.CommonClassName(Source.SourceClassId As MetabaseObjectClass));
If Source.HighlightedSourceName.Length > 0 Then
Debug.WriteLine("Наименование с подсветкой искомого значения: " + Source.HighlightedSourceName);
End If;
Debug.WriteLine("Отметка по индексированным измерениям:");
Debug.Indent;
//Отметка измерений, по которой сформирован срез
Selections := Source.Selection;
For i := 0 To Selections.Count - 1 Do
Selection := Selections.Item(i);
Debug.Write("Ключ измерения: " + Selection.DimensionKey.ToString + ". Элементы: ");
Elements := Selection.Elements;
For j := 0 To Elements.Count - 1 Do
Element := Elements.Item(j);
Debug.Write(Element.Name + '(' + Element.Key + ") ");
End For;
Debug.WriteLine("");
End For;
Debug.Unindent;
//Отметка свободных измерений, если они имеются
If Source.FreeDimensionsSelection.Count <> 0 Then
Debug.WriteLine("Отметка свободных измерений:");
Debug.Indent;
Selections := Source.FreeDimensionsSelection;
For i := 0 To Selections.Count - 1 Do
Selection := Selections.Item(i);
Debug.Write("Ключ измерения: " + Selection.DimensionKey.ToString + ". Элементы: ");
Elements := Selection.Elements;
For j := 0 To Elements.Count - 1 Do
Element := Elements.Item(j);
Debug.Write(Element.Name + '(' + Element.Key + ") ");
End For;
Debug.WriteLine("");
End For;
Debug.Unindent;
End If;
//Информация о календарных измерениях
Calendars := Source.CalendarInfo;
For i := 0 To Calendars.Count - 1 Do
Calendar := Calendars.Item(i);
MDesc := MB.Item(Calendar.Key);
Debug.WriteLine("Справочник в основе календарного измерения: " + MDesc.Name + '(' + MDesc.Id + ')');
Debug.WriteLine("Даты, на которые имеются данные: " + Calendar.DateStart.ToString + " - " +
Calendar.DateEnd.ToString);
End For;
End Sub UserProc;
При выполнении примера будет осуществлен поиск указанного значения по индексированной информации об элементах измерений. Из первого найденного результата будет получена информация об источнике данных, к которому относится срез. Различная информация об отметке источника будет выведена в консоль среды разработки.
Необходимые требования и результат выполнения примера Fore.NET совпадают с примером Fore. Кроме сборок, указанных в примере Fore, подключите также сборку «ForeSystem».
Imports Prognoz.Platform.Interop.BISearch;
Imports Prognoz.Platform.Interop.ForeSystem;
Imports Prognoz.Platform.Interop.KeFore;
Imports Prognoz.Platform.Interop.Metabase;
Public Shared Sub Main(Params: StartParams);
Var
MB: IMetabase;
MBClass: MetabaseClass = New MetabaseClassClass();
SharedParams: ISharedParams;
SearchEngine: ISolrSearchEngineService;
Schema: ISolrSearchEngineSchema;
SearchExecutor: ISearchExecutor;
SearchContext: ISolrSourceDataSearchContext;
Results: ISolrSearchResults;
Result: ISearchSourceDataResult;
Source: ISourceMetadata;
Selections: ISearchDimSelectionSet;
Selection: ISearchDimSelection;
Elements: ISearchDimSelectionElements;
Element: ISearchDimSelectionElement;
Calendars: ICalendarInfos;
Calendar: ICalendarInfo;
MDesc: IMetabaseObjectDescriptor;
i, j: Integer;
Begin
MB := Params.Metabase;
//Параметры поиска и индексации, заданные для репозитория
SharedParams := MB.SpecialObject[MetabaseSpecialObject.msoSharedParams].Bind() As ISharedParams;
SearchEngine := SharedParams.SearchEngine As ISolrSearchEngineService;
Schema := SearchEngine.SearchEngineSchema As ISolrSearchEngineSchema;
//Параметры поиска
SearchExecutor := Schema.SearchExecutor[SearchEngineTargetType.settSourceData];
SearchContext := SearchExecutor.CreateContext() As ISolrSourceDataSearchContext;
SearchContext.Locale := LocaleCodeID.lcidRussian;
SearchContext.Text := "Россия";
//Поиск
Results := SearchExecutor.Search(SearchContext) As ISolrSearchResults;
//Просмотр информации по источнику для первого результата поиска
Result := Results.Item[0] As ISearchSourceDataResult;
Source := Result.SourceMetadata;
System.Diagnostics.Debug.WriteLine("Наименование среза: " + Result.Name);
System.Diagnostics.Debug.WriteLine("Источник: " + Source.SourceName + '(' + Source.SourceId + ')');
System.Diagnostics.Debug.WriteLine("Тип объекта: " + MBClass.CommonClassName[Source.SourceClassId As MetabaseObjectClass,
NameCasePlural.ncNominative]);
If Source.HighlightedSourceName.Length > 0 Then
System.Diagnostics.Debug.WriteLine("Наименование с подсветкой искомого значения: " + Source.HighlightedSourceName);
End If;
System.Diagnostics.Debug.WriteLine("Отметка по индексированным измерениям:");
System.Diagnostics.Debug.Indent();
//Отметка измерений, по которой сформирован срез
Selections := Source.Selection;
For i := 0 To Selections.Count - 1 Do
Selection := Selections.Item[i];
System.Diagnostics.Debug.Write("Ключ измерения: " + Selection.DimensionKey.ToString() + ". Элементы: ");
Elements := Selection.Elements;
For j := 0 To Elements.Count - 1 Do
Element := Elements.Item[j];
System.Diagnostics.Debug.Write(Element.Name + '(' + Element.Key + ") ");
End For;
System.Diagnostics.Debug.WriteLine("");
End For;
System.Diagnostics.Debug.Unindent();
//Отметка свободных измерений, если они имеются
If Source.FreeDimensionsSelection.Count <> 0 Then
System.Diagnostics.Debug.WriteLine("Отметка свободных измерений:");
System.Diagnostics.Debug.Indent();
Selections := Source.FreeDimensionsSelection;
For i := 0 To Selections.Count - 1 Do
Selection := Selections.Item[i];
System.Diagnostics.Debug.Write("Ключ измерения: " + Selection.DimensionKey.ToString() + ". Элементы: ");
Elements := Selection.Elements;
For j := 0 To Elements.Count - 1 Do
Element := Elements.Item[j];
System.Diagnostics.Debug.Write(Element.Name + '(' + Element.Key + ") ");
End For;
System.Diagnostics.Debug.WriteLine("");
End For;
System.Diagnostics.Debug.Unindent();
End If;
//Информация о календарных измерениях
Calendars := Source.CalendarInfo;
For i := 0 To Calendars.Count - 1 Do
Calendar := Calendars.Item[i];
MDesc := MB.Item[Calendar.Key];
System.Diagnostics.Debug.WriteLine("Справочник в основе календарного измерения: " + MDesc.Name + '(' + MDesc.Id + ')');
System.Diagnostics.Debug.WriteLine("Даты, на которые имеются данные: " + Calendar.DateStart.ToString() + " - " +
Calendar.DateEnd.ToString());
End For;
End Sub;
См. также: