public static async Task <SearchParameterDefinitionManager> CreateSearchParameterDefinitionManagerAsync(IModelInfoProvider modelInfoProvider, IMediator mediator)
        {
            var searchService     = Substitute.For <ISearchService>();
            var definitionManager = new SearchParameterDefinitionManager(modelInfoProvider, mediator, () => searchService.CreateMockScope(), NullLogger <SearchParameterDefinitionManager> .Instance);
            await definitionManager.StartAsync(CancellationToken.None);

            await definitionManager.EnsureInitializedAsync(CancellationToken.None);

            var statusRegistry = new FilebasedSearchParameterStatusDataStore(
                definitionManager,
                modelInfoProvider);
            var statusManager = new SearchParameterStatusManager(
                statusRegistry,
                definitionManager,
                new SearchParameterSupportResolver(await GetFhirTypedElementToSearchValueConverterManagerAsync()),
                Substitute.For <IMediator>(),
                NullLogger <SearchParameterStatusManager> .Instance);
            await statusManager.EnsureInitializedAsync(CancellationToken.None);

            return(definitionManager);
        }
Beispiel #2
0
        public async Task InitializeAsync()
        {
            await _testHelper.CreateAndInitializeDatabase(_databaseName, _maximumSupportedSchemaVersion, forceIncrementalSchemaUpgrade : false, _schemaInitializer, CancellationToken.None);

            await _searchParameterDefinitionManager.EnsureInitializedAsync(CancellationToken.None);
        }
        public async Task GivenExistingSearchParameters_WhenStartingSearchParameterDefinitionManager_ThenExistingParametersAdded()
        {
            // Create some existing search paramters that will be returned when searching for resources
            // of type SearchParameter
            var searchParam = new SearchParameter()
            {
                Id   = "id",
                Url  = "http://test/Patient-preexisting",
                Type = Hl7.Fhir.Model.SearchParamType.String,
                Base = new List <ResourceType?>()
                {
                    ResourceType.Patient
                },
                Expression = "Patient.name",
                Name       = "preexisting",
                Code       = "preexisting",
            };
            SearchResult result = GetSearchResultFromSearchParam(searchParam, "token");

            var searchParam2 = new SearchParameter()
            {
                Id   = "id2",
                Url  = "http://test/Patient-preexisting2",
                Type = Hl7.Fhir.Model.SearchParamType.String,
                Base = new List <ResourceType?>()
                {
                    ResourceType.Patient
                },
                Expression = "Patient.name",
                Name       = "preexisting2",
                Code       = "preexisting2",
            };
            SearchResult result2 = GetSearchResultFromSearchParam(searchParam2, "token2");

            var searchParam3 = new SearchParameter()
            {
                Id   = "QuestionnaireResponse-questionnaire2",
                Url  = "http://hl7.org/fhir/SearchParameter/QuestionnaireResponse-questionnaire2",
                Type = Hl7.Fhir.Model.SearchParamType.Reference,
                Base = new List <ResourceType?>()
                {
                    ResourceType.QuestionnaireResponse
                },
                Expression = "QuestionnaireResponse.questionnaire",
                Name       = "questionnaire2",
                Code       = "questionnaire2",
            };
            SearchResult result3 = GetSearchResultFromSearchParam(searchParam3, "token3");

            var searchParam4 = new SearchParameter()
            {
                Id   = "QuestionnaireResponse-questionnaire",
                Url  = "http://hl7.org/fhir/SearchParameter/QuestionnaireResponse-questionnaire",
                Type = Hl7.Fhir.Model.SearchParamType.Reference,
                Base = new List <ResourceType?>()
                {
                    ResourceType.QuestionnaireResponse
                },
                Expression = "QuestionnaireResponse.questionnaire",
                Name       = "questionnaire",
                Code       = "questionnaire",
            };
            SearchResult result4 = GetSearchResultFromSearchParam(searchParam4, null);

            var searchService = Substitute.For <ISearchService>();

            searchService.SearchAsync(Arg.Is <SearchOptions>(options => options.ContinuationToken == null), Arg.Any <CancellationToken>())
            .Returns(result);
            searchService.SearchAsync(
                Arg.Is <SearchOptions>(
                    options => options.ContinuationToken == "token"),
                Arg.Any <CancellationToken>())
            .Returns(result2);
            searchService.SearchAsync(
                Arg.Is <SearchOptions>(
                    options => options.ContinuationToken == "token2"),
                Arg.Any <CancellationToken>())
            .Returns(result3);
            searchService.SearchAsync(
                Arg.Is <SearchOptions>(
                    options => options.ContinuationToken == "token3"),
                Arg.Any <CancellationToken>())
            .Returns(result4);

            var dataStoreSearchParamValidator = Substitute.For <IDataStoreSearchParameterValidator>();

            dataStoreSearchParamValidator.ValidateSearchParameter(Arg.Any <SearchParameterInfo>(), out Arg.Any <string>()).Returns(true);

            _searchParameterSupportResolver
            .IsSearchParameterSupported(Arg.Is <SearchParameterInfo>(s => s.Name.StartsWith("preexisting")))
            .Returns((true, false));

            var searchParameterDefinitionManager = new SearchParameterDefinitionManager(ModelInfoProvider.Instance, _mediator, () => searchService.CreateMockScope(), NullLogger <SearchParameterDefinitionManager> .Instance);

            await searchParameterDefinitionManager.EnsureInitializedAsync(CancellationToken.None);

            var statusManager = new SearchParameterStatusManager(
                _searchParameterStatusDataStore,
                searchParameterDefinitionManager,
                _searchParameterSupportResolver,
                _mediator,
                NullLogger <SearchParameterStatusManager> .Instance);

            await statusManager.EnsureInitializedAsync(CancellationToken.None);

            var patientParams = searchParameterDefinitionManager.GetSearchParameters("Patient");

            Assert.False(patientParams.Where(p => p.Name == "preexisting").First().IsSearchable);
            Assert.True(patientParams.Where(p => p.Name == "preexisting2").First().IsSearchable);

            var questionnaireParams = searchParameterDefinitionManager.GetSearchParameters("QuestionnaireResponse");

            Assert.Single(questionnaireParams.Where(p => p.Name == "questionnaire2"));
        }
Beispiel #4
0
        public async Task InitializeAsync()
        {
            var fhirStoredProcs = typeof(IStoredProcedure).Assembly
                                  .GetTypes()
                                  .Where(x => !x.IsAbstract && typeof(IStoredProcedure).IsAssignableFrom(x))
                                  .ToArray()
                                  .Select(type => (IStoredProcedure)Activator.CreateInstance(type));

            var optionsMonitor = Substitute.For <IOptionsMonitor <CosmosCollectionConfiguration> >();

            optionsMonitor.Get(CosmosDb.Constants.CollectionConfigurationName).Returns(_cosmosCollectionConfiguration);

            _fhirRequestContextAccessor.RequestContext.CorrelationId.Returns(Guid.NewGuid().ToString());
            _fhirRequestContextAccessor.RequestContext.RouteName.Returns("routeName");

            _searchParameterDefinitionManager = new SearchParameterDefinitionManager(ModelInfoProvider.Instance, _mediator, () => _searchService.CreateMockScope(), NullLogger <SearchParameterDefinitionManager> .Instance);
            await _searchParameterDefinitionManager.StartAsync(CancellationToken.None);

            _supportedSearchParameterDefinitionManager = new SupportedSearchParameterDefinitionManager(_searchParameterDefinitionManager);
            var searchableSearchParameterDefinitionManager = new SearchableSearchParameterDefinitionManager(_searchParameterDefinitionManager, _fhirRequestContextAccessor);

            _filebasedSearchParameterStatusDataStore = new FilebasedSearchParameterStatusDataStore(_searchParameterDefinitionManager, ModelInfoProvider.Instance);

            IMediator mediator = Substitute.For <IMediator>();

            var updaters = new ICollectionUpdater[]
            {
                new FhirCollectionSettingsUpdater(_cosmosDataStoreConfiguration, optionsMonitor, NullLogger <FhirCollectionSettingsUpdater> .Instance),
                new StoredProcedureInstaller(fhirStoredProcs),
                new CosmosDbSearchParameterStatusInitializer(
                    () => _filebasedSearchParameterStatusDataStore,
                    new CosmosQueryFactory(
                        new CosmosResponseProcessor(_fhirRequestContextAccessor, mediator, Substitute.For <ICosmosQueryLogger>(), NullLogger <CosmosResponseProcessor> .Instance),
                        NullFhirCosmosQueryLogger.Instance),
                    _cosmosDataStoreConfiguration),
            };

            var dbLock = new CosmosDbDistributedLockFactory(Substitute.For <Func <IScoped <Container> > >(), NullLogger <CosmosDbDistributedLock> .Instance);

            var upgradeManager = new CollectionUpgradeManager(updaters, _cosmosDataStoreConfiguration, optionsMonitor, dbLock, NullLogger <CollectionUpgradeManager> .Instance);
            ICosmosClientTestProvider testProvider = new CosmosClientReadWriteTestProvider();

            var cosmosResponseProcessor = Substitute.For <ICosmosResponseProcessor>();

            var responseProcessor           = new CosmosResponseProcessor(_fhirRequestContextAccessor, mediator, Substitute.For <ICosmosQueryLogger>(), NullLogger <CosmosResponseProcessor> .Instance);
            var handler                     = new FhirCosmosResponseHandler(() => new NonDisposingScope(_container), _cosmosDataStoreConfiguration, _fhirRequestContextAccessor, responseProcessor);
            var retryExceptionPolicyFactory = new RetryExceptionPolicyFactory(_cosmosDataStoreConfiguration, _fhirRequestContextAccessor);
            var documentClientInitializer   = new FhirCosmosClientInitializer(testProvider, () => new[] { handler }, retryExceptionPolicyFactory, NullLogger <FhirCosmosClientInitializer> .Instance);

            _cosmosClient = documentClientInitializer.CreateCosmosClient(_cosmosDataStoreConfiguration);
            var fhirCollectionInitializer = new CollectionInitializer(_cosmosCollectionConfiguration, _cosmosDataStoreConfiguration, upgradeManager, retryExceptionPolicyFactory, testProvider, NullLogger <CollectionInitializer> .Instance);

            // Cosmos DB emulators throws errors when multiple collections are initialized concurrently.
            // Use the semaphore to only allow one initialization at a time.
            await CollectionInitializationSemaphore.WaitAsync();

            try
            {
                await documentClientInitializer.InitializeDataStore(_cosmosClient, _cosmosDataStoreConfiguration, new List <ICollectionInitializer> {
                    fhirCollectionInitializer
                });

                _container = documentClientInitializer.CreateFhirContainer(_cosmosClient, _cosmosDataStoreConfiguration.DatabaseId, _cosmosCollectionConfiguration.CollectionId);
            }
            finally
            {
                CollectionInitializationSemaphore.Release();
            }

            var cosmosDocumentQueryFactory = new CosmosQueryFactory(cosmosResponseProcessor, NullFhirCosmosQueryLogger.Instance);

            var documentClient = new NonDisposingScope(_container);

            _searchParameterStatusDataStore = new CosmosDbSearchParameterStatusDataStore(
                () => documentClient,
                _cosmosDataStoreConfiguration,
                cosmosDocumentQueryFactory);

            IOptions <CoreFeatureConfiguration> options = Options.Create(new CoreFeatureConfiguration());

            _fhirDataStore = new CosmosFhirDataStore(
                documentClient,
                _cosmosDataStoreConfiguration,
                optionsMonitor,
                cosmosDocumentQueryFactory,
                retryExceptionPolicyFactory,
                NullLogger <CosmosFhirDataStore> .Instance,
                options,
                new Lazy <ISupportedSearchParameterDefinitionManager>(_supportedSearchParameterDefinitionManager),
                ModelInfoProvider.Instance);

            _fhirOperationDataStore = new CosmosFhirOperationDataStore(
                documentClient,
                _cosmosDataStoreConfiguration,
                optionsMonitor,
                retryExceptionPolicyFactory,
                new CosmosQueryFactory(responseProcessor, new NullFhirCosmosQueryLogger()),
                NullLogger <CosmosFhirOperationDataStore> .Instance);

            var searchParameterExpressionParser = new SearchParameterExpressionParser(new ReferenceSearchValueParser(_fhirRequestContextAccessor));
            var expressionParser     = new ExpressionParser(() => searchableSearchParameterDefinitionManager, searchParameterExpressionParser);
            var searchOptionsFactory = new SearchOptionsFactory(expressionParser, () => searchableSearchParameterDefinitionManager, options, _fhirRequestContextAccessor, Substitute.For <ISortingValidator>(), NullLogger <SearchOptionsFactory> .Instance);

            ICosmosDbCollectionPhysicalPartitionInfo cosmosDbPhysicalPartitionInfo = Substitute.For <ICosmosDbCollectionPhysicalPartitionInfo>();

            cosmosDbPhysicalPartitionInfo.PhysicalPartitionCount.Returns(1);

            _searchService = new FhirCosmosSearchService(
                searchOptionsFactory,
                _fhirDataStore,
                new QueryBuilder(),
                _fhirRequestContextAccessor,
                _cosmosDataStoreConfiguration,
                cosmosDbPhysicalPartitionInfo,
                new QueryPartitionStatisticsCache(),
                Enumerable.Empty <ICosmosExpressionRewriter>(),
                NullLogger <FhirCosmosSearchService> .Instance);

            await _searchParameterDefinitionManager.EnsureInitializedAsync(CancellationToken.None);

            ISearchParameterSupportResolver searchParameterSupportResolver = Substitute.For <ISearchParameterSupportResolver>();

            searchParameterSupportResolver.IsSearchParameterSupported(Arg.Any <SearchParameterInfo>()).Returns((true, false));

            _searchParameterStatusManager = new SearchParameterStatusManager(
                _searchParameterStatusDataStore,
                _searchParameterDefinitionManager,
                searchParameterSupportResolver,
                mediator,
                NullLogger <SearchParameterStatusManager> .Instance);

            _fhirStorageTestHelper = new CosmosDbFhirStorageTestHelper(_container);
        }
 public async Task InitializeAsync()
 {
     await _searchParameterDefinitionManager.EnsureInitializedAsync(CancellationToken.None);
 }