public IActionResult Get(string id)
        {
            var service = serviceQuery.Get(id);

            if (service == null)
            {
                return(new StatusCodeResult(StatusCodes.Status404NotFound));
            }
            if (service.Type != (int)ServiceTypeEnum.Search)
            {
                return(new HttpStatusCodeWithErrorResult(StatusCodes.Status400BadRequest, string.Format(ServiceResources.InvalidServiceTypeOnly_0_ServicesAreValidForThisRequest, "Search")));
            }

            SearchActivateSettings activateSettings = null;
            SearchPrepareSettings  prepareSettings  = null;

            var searchSettingsElastic = serviceQuery.GetSettings <SearchSettingsWrapperElastic>(service.Id);

            if (searchSettingsElastic != null)
            {
                prepareSettings  = searchSettingsElastic.ToSearchPrepareSettingsModel();
                activateSettings = searchSettingsElastic.ToSearchActivateSettingsModel();
            }

            var respService = service.ToServiceModel <SearchService>();

            respService.ActualProcessId  = service.ProcessIdList.FirstOrDefault(pid => GlobalStore.Processes.IsExist(pid));
            respService.ActivateSettings = activateSettings;
            respService.PrepareSettings  = prepareSettings;

            return(new OkObjectResult(respService));
        }
        public static SearchActivateSettings ToSearchActivateSettingsModel(this SearchSettingsWrapperElastic searchWrapper)
        {
            var model = new SearchActivateSettings {
                AutoCompleteSettings = searchWrapper.AutoCompleteSettings?.ToAutoCompleteSettingsModel(),
                ClassifierSettings   = searchWrapper.ClassifierSettings?.ToClassifierSettingsModel(),
                SearchSettings       = searchWrapper.SearchSettings?.ToSearchSettingsModel()
            };

            return(model);
        }
        public IActionResult Activate(string id, [FromBody] SearchActivateSettings searchActivateSettings)
        {
            //SERVICE VALIDATION
            var service = serviceQuery.Get(id);

            if (service == null)
            {
                return(new HttpStatusCodeWithErrorResult(StatusCodes.Status404NotFound, ServiceResources.InvalidIdNotExistingService));
            }
            if (service.Type != (int)ServiceTypeEnum.Search)
            {
                return(new HttpStatusCodeWithErrorResult(StatusCodes.Status400BadRequest, string.Format(ServiceResources.InvalidServiceTypeOnly_0_ServicesAreValidForThisRequest, "Search")));
            }
            if (service.Status != (int)ServiceStatusEnum.Prepared)
            {
                return(new HttpStatusCodeWithErrorResult(StatusCodes.Status400BadRequest, ServiceResources.InvalidStatusOnlyTheServicesWithPreparedStatusCanBeActivated));
            }

            var searchSettings = serviceQuery.GetSettings <SearchSettingsWrapperElastic>(service.Id);

            if (searchActivateSettings != null)
            {
                if (searchActivateSettings.AutoCompleteSettings != null)
                {
                    var validationResult = Validate(searchActivateSettings.AutoCompleteSettings);
                    if (validationResult != null)
                    {
                        return(validationResult);
                    }
                    searchSettings.AutoCompleteSettings = searchActivateSettings.AutoCompleteSettings.ToAutoCompleteSettingsElastic(searchSettings.AutoCompleteSettings);
                }
                if (searchActivateSettings.ClassifierSettings != null)
                {
                    var validationResult = Validate(searchActivateSettings.ClassifierSettings);
                    if (validationResult != null)
                    {
                        return(validationResult);
                    }
                    searchSettings.ClassifierSettings = searchActivateSettings.ClassifierSettings.ToClassifierSearchSettingsElastic(searchSettings.ClassifierSettings);
                    // there isn't default settings here at the prepare step so we have to set it up here
                    if (searchSettings.ClassifierSettings?.Count == 0)
                    {
                        searchSettings.ClassifierSettings.Count = 3;
                    }
                }
                if (searchActivateSettings.SearchSettings != null)
                {
                    var validationResult = Validate(searchSettings.DataSetName, searchActivateSettings.SearchSettings);
                    if (validationResult != null)
                    {
                        return(validationResult);
                    }
                    searchSettings.SearchSettings = searchActivateSettings.SearchSettings.ToSearchSettingsElastic(searchSettings.SearchSettings);
                }
            }
            service.Status = (int)ServiceStatusEnum.Active;

            var process = processHandler.Create(
                ProcessTypeEnum.SearchActivate,
                service.Id,
                searchSettings,
                string.Format(ServiceResources.Activating_0_Service_1, ServiceTypeEnum.Search, service.Name));

            service.ProcessIdList.Add(process.Id);
            serviceQuery.Update(service.Id, service);
            serviceQuery.IndexSettings(searchSettings);

            processHandler.Start(process, (tokenSource) => searchHandler.Activate(process.Id, searchSettings, tokenSource.Token));

            return(new HttpStatusCodeWithObjectResult(StatusCodes.Status202Accepted, process.ToProcessModel()));
        }
        public IActionResult Prepare(string id, [FromBody] SearchPrepareSettings searchPrepareSettings)
        {
            //SERVICE VALIDATION
            var service = serviceQuery.Get(id);

            if (service == null)
            {
                return(new HttpStatusCodeWithErrorResult(StatusCodes.Status404NotFound, ServiceResources.InvalidIdNotExistingService));
            }
            if (service.Type != (int)ServiceTypeEnum.Search)
            {
                return(new HttpStatusCodeWithErrorResult(StatusCodes.Status400BadRequest, string.Format(ServiceResources.InvalidServiceTypeOnly_0_ServicesAreValidForThisRequest, "Search")));
            }
            if (service.Status != (int)ServiceStatusEnum.New)
            {
                return(new HttpStatusCodeWithErrorResult(StatusCodes.Status400BadRequest, ServiceResources.InvalidStatusOnlyTheServicesWithNewStatusCanBePrepared));
            }

            //DATASET VALIDATION
            if (!GlobalStore.DataSets.IsExist(searchPrepareSettings.DataSetName))
            {
                return(new HttpStatusCodeWithErrorResult(StatusCodes.Status400BadRequest,
                                                         string.Format(ServiceResources.DataSet_0_NotFound, searchPrepareSettings.DataSetName)));
            }

            var globalStoreDataSet = GlobalStore.DataSets.Get(searchPrepareSettings.DataSetName);
            var dataSet            = globalStoreDataSet.DataSet;

            var serviceSettings = new SearchSettingsWrapperElastic
            {
                DataSetName = globalStoreDataSet.DataSet.Name,
                ServiceId   = service.Id
            };

            // SETUP default values for Activation - here we can calculate more accurate settings for the dataset

            var defaultActivationSettings = new SearchActivateSettings();

            serviceSettings.AutoCompleteSettings = new AutoCompleteSettingsElastic
            {
                Confidence    = 2.0,
                Count         = 3,
                MaximumErrors = 0.5
            };

            serviceSettings.SearchSettings = new SearchSettingsElastic
            {
                Count             = 3,
                CutOffFrequency   = 0.001,
                Filter            = null,
                Fuzziness         = -1,
                ResponseFieldList = dataSet.InterpretedFields.Union(new List <string> {
                    dataSet.IdField, dataSet.TagField
                }).ToList(),
                SearchFieldList   = dataSet.InterpretedFields,
                Type              = (int)SearchTypeEnum.Match,
                Weights           = null,
                Operator          = (int)LogicalOperatorEnum.OR,
                UseDefaultFilter  = true,
                UseDefaultWeights = true,
                Order             = null
            };

            serviceQuery.IndexSettings(serviceSettings);

            var process = processHandler.Create(
                ProcessTypeEnum.SearchPrepare,
                service.Id, searchPrepareSettings,
                string.Format(ServiceResources.Preparing_0_Service_1, ServiceTypeEnum.Search, service.Name));

            service.ProcessIdList.Add(process.Id);
            serviceQuery.Update(service.Id, service);

            processHandler.Start(process, (tokenSource) => searchHandler.Prepare(process.Id, serviceSettings, tokenSource.Token));

            return(new HttpStatusCodeWithObjectResult(StatusCodes.Status202Accepted, process.ToProcessModel()));
        }