Exemplo n.º 1
0
        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);
        }
Exemplo n.º 2
0
        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);
        }