protected AbstractJavaScriptIndex(IndexDefinition definition, RavenConfiguration configuration, Action <List <string> > modifyMappingFunctions, string mapCode, long indexVersion) { Definition = definition; var indexConfiguration = new SingleIndexConfiguration(definition.Configuration, configuration); // we create the Jint instance directly instead of using SingleRun // because the index is single threaded and long lived var resolver = new JintPreventResolvingTasksReferenceResolver(); _engine = new Engine(options => { options.LimitRecursion(64) .SetReferencesResolver(resolver) .MaxStatements(indexConfiguration.MaxStepsForScript) .Strict(configuration.Patching.StrictMode) .AddObjectConverter(new JintGuidConverter()) .AddObjectConverter(new JintStringConverter()) .AddObjectConverter(new JintEnumConverter()) .AddObjectConverter(new JintDateTimeConverter()) .AddObjectConverter(new JintTimeSpanConverter()) .LocalTimeZone(TimeZoneInfo.Utc); }); using (_engine.DisableMaxStatements()) { var maps = GetMappingFunctions(modifyMappingFunctions); var mapReferencedCollections = InitializeEngine(definition, maps, mapCode); var definitions = GetDefinitions(); ProcessMaps(definitions, resolver, maps, mapReferencedCollections, out var collectionFunctions); ProcessReduce(definition, definitions, resolver, indexVersion); ProcessFields(definition, collectionFunctions); } _javaScriptUtils = new JavaScriptUtils(null, _engine); }
internal IndexCreationOptions GetIndexCreationOptions(object indexDefinition, Index existingIndex) { if (existingIndex == null) { return(IndexCreationOptions.Create); } //if (existingIndex.Definition.IsTestIndex) // TODO [ppekrol] // return IndexCreationOptions.Update; var result = IndexDefinitionCompareDifferences.None; var indexDef = indexDefinition as IndexDefinition; if (indexDef != null) { result = existingIndex.Definition.Compare(indexDef); } var indexDefBase = indexDefinition as IndexDefinitionBase; if (indexDefBase != null) { result = existingIndex.Definition.Compare(indexDefBase); } if (result == IndexDefinitionCompareDifferences.All) { return(IndexCreationOptions.Update); } result &= ~IndexDefinitionCompareDifferences.IndexId; // we do not care about IndexId if (result == IndexDefinitionCompareDifferences.None) { return(IndexCreationOptions.Noop); } if (result.HasFlag(IndexDefinitionCompareDifferences.Maps) || result.HasFlag(IndexDefinitionCompareDifferences.Reduce)) { return(IndexCreationOptions.Update); } if (result.HasFlag(IndexDefinitionCompareDifferences.Fields)) { return(IndexCreationOptions.Update); } if (result.HasFlag(IndexDefinitionCompareDifferences.Configuration)) { var currentConfiguration = existingIndex.Configuration as SingleIndexConfiguration; if (currentConfiguration == null) // should not happen { return(IndexCreationOptions.Update); } var newConfiguration = new SingleIndexConfiguration(indexDef.Configuration, _documentDatabase.Configuration); var configurationResult = currentConfiguration.CalculateUpdateType(newConfiguration); switch (configurationResult) { case IndexUpdateType.None: break; case IndexUpdateType.Refresh: return(IndexCreationOptions.UpdateWithoutUpdatingCompiledIndex); case IndexUpdateType.Reset: return(IndexCreationOptions.Update); default: throw new ArgumentOutOfRangeException(); } } if (result.HasFlag(IndexDefinitionCompareDifferences.MapsFormatting) || result.HasFlag(IndexDefinitionCompareDifferences.ReduceFormatting)) { return(IndexCreationOptions.UpdateWithoutUpdatingCompiledIndex); } return(IndexCreationOptions.Update); }