Ejemplo n.º 1
0
        public void CreateMapReduceIndex()
        {
            var mapping = new Data.DynamicQueryMapping()
            {
                AggregationOperation = AggregationOperation.Count,
                Items = new[]{
                        new DynamicQueryMappingItem(){
                             From = "User.Name",
                             To = "UserName"
                        }
                 }
            };

            var definition = mapping.CreateIndexDefinition();
            Assert.Equal(@"from doc in docs
select new { UserName = doc.User.Name, Count = 1 }", definition.Map);
            Assert.Equal(@"from result in results
group result by result.UserName
into g
select new
{
	UserName = g.Key,
	Count = g.Sum(x=>x.Count)
}
", definition.Reduce);
        }
Ejemplo n.º 2
0
		private QueryResult ExecuteActualQuery(IndexQuery query, DynamicQueryMapping map, Tuple<string, bool> touchTemporaryIndexResult, string realQuery)
		{
			// Perform the query until we have some results at least
			QueryResult result;
			var sp = Stopwatch.StartNew();
			while (true)
			{
				result = documentDatabase.Query(map.IndexName,
				                                new IndexQuery
				                                {
				                                	Cutoff = query.Cutoff,
				                                	PageSize = query.PageSize,
				                                	Query = realQuery,
				                                	Start = query.Start,
				                                	FieldsToFetch = query.FieldsToFetch,
				                                	GroupBy = query.GroupBy,
				                                	AggregationOperation = query.AggregationOperation,
				                                	SortedFields = query.SortedFields,
				                                });

				if (!touchTemporaryIndexResult.Item2 ||
				    !result.IsStale ||
				    result.Results.Count >= query.PageSize ||
				    sp.Elapsed.TotalSeconds > 15)
				{
					return result;
				}

				Thread.Sleep(100);
			}
		}
Ejemplo n.º 3
0
		private static void UpdateFieldNamesForSortedFields(IndexQuery query, DynamicQueryMapping map)
		{
			if (query.SortedFields == null) return;
			foreach (var sortedField in query.SortedFields)
			{
				var item = map.Items.FirstOrDefault(x => x.From == sortedField.Field);
				if (item != null)
					sortedField.Field = item.To;
			}
		}
Ejemplo n.º 4
0
        private static IndexQuery CreateIndexQuery(IndexQuery query, DynamicQueryMapping map, string realQuery)
        {
            var indexQuery = new IndexQuery
            {
                Cutoff = query.Cutoff,
                WaitForNonStaleResultsAsOfNow = query.WaitForNonStaleResultsAsOfNow,
                PageSize = query.PageSize,
                Query = realQuery,
                Start = query.Start,
                FieldsToFetch = query.FieldsToFetch,
                IsDistinct = query.IsDistinct,
                SortedFields = query.SortedFields,
                DefaultField = query.DefaultField,
                CutoffEtag = query.CutoffEtag,
                DebugOptionGetIndexEntries = query.DebugOptionGetIndexEntries,
                DefaultOperator = query.DefaultOperator,
                SkippedResults = query.SkippedResults,
                HighlighterPreTags = query.HighlighterPreTags,
                HighlighterPostTags = query.HighlighterPostTags,
                HighlightedFields = query.HighlightedFields,
                HighlighterKeyName = query.HighlighterKeyName,
                ResultsTransformer = query.ResultsTransformer,
                TransformerParameters = query.TransformerParameters,
                ExplainScores = query.ExplainScores,
                SortHints = query.SortHints,
                ShowTimings = query.ShowTimings,
                AllowMultipleIndexEntriesForSameDocumentToResultTransformer = query.AllowMultipleIndexEntriesForSameDocumentToResultTransformer,
                DisableCaching = query.DisableCaching,
                SkipDuplicateChecking = query.SkipDuplicateChecking,
                WaitForNonStaleResults = query.WaitForNonStaleResults
                
            };
            if (indexQuery.SortedFields == null)
                return indexQuery;

            for (int index = 0; index < indexQuery.SortedFields.Length; index++)
            {
                var sortedField = indexQuery.SortedFields[index];
                var fieldName = sortedField.Field;
                bool hasRange = false;
                if (fieldName.EndsWith("_Range"))
                {
                    fieldName = fieldName.Substring(0, fieldName.Length - "_Range".Length);
                    hasRange = true;
                }
            
                var item = map.Items.FirstOrDefault(x => string.Equals(x.QueryFrom, fieldName, StringComparison.InvariantCultureIgnoreCase));
                if (item == null)
                    continue;

                indexQuery.SortedFields[index] = new SortedField(hasRange ? item.To + "_Range" : item.To);
                indexQuery.SortedFields[index].Descending = sortedField.Descending;
            }
            return indexQuery;
        }
Ejemplo n.º 5
0
		private static void UpdateFieldsInArray(DynamicQueryMapping map, string[] fields)
		{
			if (fields == null)
				return;
			for (var i = 0; i < fields.Length; i++)
			{
				var item = map.Items.FirstOrDefault(x => x.From == fields[i]);
				if (item != null)
					fields[i] = item.To;
			}
		}
Ejemplo n.º 6
0
        public static DynamicQueryMapping Create(DocumentDatabase database, IndexQuery query, string entityName)
        {
            var fields = SimpleQueryParser.GetFieldsForDynamicQuery(query);

            if (query.SortedFields != null)
            {
                foreach (var sortedField in query.SortedFields)
                {
                    var field = sortedField.Field;
                    if (field.StartsWith(Constants.RandomFieldName))
                    {
                        continue;
                    }
                    if (field.StartsWith(Constants.CustomSortFieldName))
                    {
                        continue;
                    }
                    if (field == Constants.TemporaryScoreValue)
                    {
                        continue;
                    }

                    if (field.EndsWith("_Range"))
                    {
                        field = field.Substring(0, field.Length - "_Range".Length);
                    }

                    fields.Add(Tuple.Create(SimpleQueryParser.TranslateField(field), field));
                }
            }

            var dynamicQueryMapping = new DynamicQueryMapping
            {
                ForEntityName     = entityName,
                HighlightedFields = query.HighlightedFields.EmptyIfNull().Select(x => x.Field).ToArray(),
                SortDescriptors   = GetSortInfo(fieldName =>
                {
                    if (fields.Any(x => x.Item2 == fieldName || x.Item2 == (fieldName + "_Range")) == false)
                    {
                        fields.Add(Tuple.Create(fieldName, fieldName));
                    }
                }, query)
            };

            dynamicQueryMapping.SetupFieldsToIndex(query, fields);
            dynamicQueryMapping.SetupSortDescriptors(dynamicQueryMapping.SortDescriptors);
            dynamicQueryMapping.FindIndexName(database, dynamicQueryMapping, query);
            return(dynamicQueryMapping);
        }
Ejemplo n.º 7
0
		private Tuple<string, bool> GetAppropriateIndexToQuery(string entityName, IndexQuery query, DynamicQueryMapping map)
		{
			var appropriateIndex = new DynamicQueryOptimizer(documentDatabase).SelectAppropriateIndex(entityName, query);
			if (appropriateIndex != null)
			{
				if (appropriateIndex.StartsWith("Temp/"))// temporary index, we need to increase its usage
				{
					return  TouchTemporaryIndex(appropriateIndex, "Auto/" + appropriateIndex.Substring(5),
					                                                () => documentDatabase.IndexDefinitionStorage.GetIndexDefinition(appropriateIndex));
				}
				return Tuple.Create(appropriateIndex, false);
			}
			return TouchTemporaryIndex(map.TemporaryIndexName, map.PermanentIndexName,
			                                                map.CreateIndexDefinition);
		}
Ejemplo n.º 8
0
        public void CreateDefinitionSupportsArrayProperties()
        {
            Data.DynamicQueryMapping mapping = new Data.DynamicQueryMapping()
            {
                Items = new Data.DynamicQueryMappingItem[]{
                        new Data.DynamicQueryMappingItem(){
                             From = "Tags,Name",
                             To = "docTagsName"
                        }
                 }
            };

            var definition = mapping.CreateIndexDefinition();
            Assert.Equal("from doc in docs\r\nfrom docTagsItem in doc.Tags\r\nselect new { docTagsName = docTagsItem.Name }", definition.Map);
        }
Ejemplo n.º 9
0
        public void CreateDefinitionSupportsArrayProperties()
        {
            Data.DynamicQueryMapping mapping = new Data.DynamicQueryMapping()
            {
                Items = new Data.DynamicQueryMappingItem[]{
                        new Data.DynamicQueryMappingItem(){
                             From = "Tags,Name",
                             To = "docTagsName"
                        }
                 }
            };

            var definition = mapping.CreateIndexDefinition();
            Assert.Equal("from doc in docs\r\nfrom docTagsItem in (IEnumerable<dynamic>)doc.Tags\r\nselect new { docTagsName = docTagsItem.Name }", definition.Map);
        }
Ejemplo n.º 10
0
        public void CreateDefinitionSupportsNestedProperties()
        {
            Data.DynamicQueryMapping mapping = new Data.DynamicQueryMapping()
            {
                Items = new Data.DynamicQueryMappingItem[]{
                        new Data.DynamicQueryMappingItem(){
                             From = "User.Name",
                             To = "UserName"
                        }
                 }
            };

            var definition = mapping.CreateIndexDefinition();
            Assert.Equal("from doc in docs\r\nselect new { UserName = doc.User.Name }", definition.Map);
        }
Ejemplo n.º 11
0
        private string FindDynamicIndexName(DynamicQueryMapping map)
        {
            var targetName = map.ForEntityName ?? "AllDocs";

            var combinedFields = String.Join("And",
                map.Items
                .OrderBy(x => x.To)
                .Select(x => x.To));
            var indexName = combinedFields;

            if (map.SortDescriptors != null && map.SortDescriptors.Length > 0)
            {
                indexName = string.Format("{0}SortBy{1}", indexName,
                                          String.Join("",
                                                      map.SortDescriptors
                                                          .Select(x => x.Field)
                                                          .OrderBy(x => x)));
            }


            // Hash the name if it's too long
            if (indexName.Length > 230)
            {
                using (var sha256 = SHA256.Create())
                {
                    var bytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(indexName));
                    indexName = Encoding.UTF8.GetString(bytes);
                }
            }

            var permanentIndexName = indexName.Length == 0
                    ? string.Format("Auto/{0}", targetName)
                    : string.Format("Auto/{0}/By{1}", targetName, indexName);

            var temporaryIndexName = indexName.Length == 0
                    ? string.Format("Temp/{0}", targetName)
                    : string.Format("Temp/{0}/By{1}", targetName, indexName);

            // If there is a permanent index, then use that without bothering anything else
            var permanentIndex = documentDatabase.GetIndexDefinition(permanentIndexName);
            if (permanentIndex != null) { return permanentIndexName; }

            // Else head down the temporary route
            return TouchTemporaryIndex(map, temporaryIndexName, permanentIndexName);           
        }
Ejemplo n.º 12
0
		private QueryResultWithIncludes ExecuteActualQuery(IndexQuery query, DynamicQueryMapping map, Tuple<string, bool> touchTemporaryIndexResult, string realQuery)
		{
			// Perform the query until we have some results at least
			QueryResultWithIncludes result;
			var sp = Stopwatch.StartNew();
			while (true)
			{
				result = documentDatabase.Query(map.IndexName,
												new IndexQuery
												{
													Cutoff = query.Cutoff,
													PageSize = query.PageSize,
													Query = realQuery,
													Start = query.Start,
													FieldsToFetch = query.FieldsToFetch,
													GroupBy = query.GroupBy,
													AggregationOperation = query.AggregationOperation,
													SortedFields = query.SortedFields,
													DefaultField = query.DefaultField,
													CutoffEtag = query.CutoffEtag,
													DebugOptionGetIndexEntries = query.DebugOptionGetIndexEntries,
													DefaultOperator = query.DefaultOperator,
													SkipTransformResults = query.SkipTransformResults,
													SkippedResults = query.SkippedResults,
													HighlighterPreTags = query.HighlighterPreTags,
													HighlighterPostTags = query.HighlighterPostTags,
													HighlightedFields = query.HighlightedFields,
                                                    ResultsTransformer = query.ResultsTransformer,
                                                    QueryInputs = query.QueryInputs
												});

				if (!touchTemporaryIndexResult.Item2 ||
					!result.IsStale ||
					(result.Results.Count >= query.PageSize && query.PageSize > 0) ||
					sp.Elapsed.TotalSeconds > 15)
				{
					return result;
				}

				Thread.Sleep(100);
			}
		}
Ejemplo n.º 13
0
		private QueryResultWithIncludes ExecuteActualQuery(IndexQuery query, DynamicQueryMapping map, Tuple<string, bool> touchTemporaryIndexResult, string realQuery)
		{
			// Perform the query until we have some results at least
			QueryResultWithIncludes result;
			var sp = Stopwatch.StartNew();
			while (true)
			{
				var indexQuery = CreateIndexQuery(query, map, realQuery);
				result = documentDatabase.Query(map.IndexName, indexQuery);

				if (!touchTemporaryIndexResult.Item2 ||
					!result.IsStale ||
					(result.Results.Count >= query.PageSize && query.PageSize > 0) ||
					sp.Elapsed.TotalSeconds > 15)
				{
					return result;
				}

				Thread.Sleep(100);
			}
		}
Ejemplo n.º 14
0
        public static DynamicQueryMapping Create(DocumentDatabase database, IndexQuery query, string entityName)
        {
            var fields = SimpleQueryParser.GetFieldsForDynamicQuery(query);

            if (query.SortedFields != null)
            {
                foreach (var sortedField in query.SortedFields)
                {
                    if (sortedField.Field.StartsWith(Constants.RandomFieldName))
                    {
                        continue;
                    }
                    if (sortedField.Field == Constants.TemporaryScoreValue)
                    {
                        continue;
                    }
                    fields.Add(Tuple.Create(sortedField.Field, sortedField.Field));
                }
            }

            var dynamicQueryMapping = new DynamicQueryMapping
            {
                AggregationOperation = query.AggregationOperation.RemoveOptionals(),
                DynamicAggregation   = query.AggregationOperation.HasFlag(AggregationOperation.Dynamic),
                ForEntityName        = entityName,
                HighlightedFields    = query.HighlightedFields.EmptyIfNull().Select(x => x.Field).ToArray(),
                SortDescriptors      = GetSortInfo(fieldName =>
                {
                    if (fields.Any(x => x.Item2 == fieldName || x.Item2 == (fieldName + "_Range")) == false)
                    {
                        fields.Add(Tuple.Create(fieldName, fieldName));
                    }
                })
            };

            dynamicQueryMapping.SetupFieldsToIndex(query, fields);
            dynamicQueryMapping.SetupSortDescriptors(dynamicQueryMapping.SortDescriptors);
            dynamicQueryMapping.FindIndexName(database, dynamicQueryMapping, query);
            return(dynamicQueryMapping);
        }
Ejemplo n.º 15
0
        private void FindIndexName(DocumentDatabase database, DynamicQueryMapping map, IndexQuery query)
        {
            var targetName = map.ForEntityName ?? "AllDocs";

            var combinedFields = String.Join("And",
                                             map.Items
                                             .OrderBy(x => x.To)
                                             .Select(x => x.To));
            var indexName = combinedFields;

            if (map.SortDescriptors != null && map.SortDescriptors.Length > 0)
            {
                indexName = string.Format("{0}SortBy{1}", indexName,
                                          String.Join("",
                                                      map.SortDescriptors
                                                      .Select(x => x.Field)
                                                      .OrderBy(x => x)));
            }
            if (map.HighlightedFields != null && map.HighlightedFields.Length > 0)
            {
                indexName = string.Format("{0}Highlight{1}", indexName,
                                          string.Join("", map.HighlightedFields.OrderBy(x => x)));
            }
            string groupBy = null;

            if (database.Configuration.RunInUnreliableYetFastModeThatIsNotSuitableForProduction == false &&
                database.Configuration.RunInMemory == false)
            {
                indexName = IndexingUtil.FixupIndexName(indexName, database.Configuration.DataDirectory);
            }

            var permanentIndexName = indexName.Length == 0
                                        ? string.Format("Auto/{0}{1}", targetName, groupBy)
                                        : string.Format("Auto/{0}/By{1}{2}", targetName, indexName, groupBy);

            map.IndexName = permanentIndexName;
        }
Ejemplo n.º 16
0
        public static DynamicQueryMapping Create(DocumentDatabase database, IndexQuery query, string entityName)
        {
            var fields = SimpleQueryParser.GetFieldsForDynamicQuery(query.Query);

            if (query.SortedFields != null)
            {
                foreach (var sortedField in query.SortedFields)
                {
                    fields.Add(Tuple.Create(sortedField.Field, sortedField.Field));
                }
            }

            var dynamicQueryMapping = new DynamicQueryMapping
            {
                AggregationOperation = query.AggregationOperation & ~AggregationOperation.Dynamic,
                DynamicAggregation   = (query.AggregationOperation & AggregationOperation.Dynamic) == AggregationOperation.Dynamic,
                ForEntityName        = entityName,
                SortDescriptors      = GetSortInfo(fields)
            };

            dynamicQueryMapping.SetupFieldsToIndex(query, fields);
            dynamicQueryMapping.FindIndexName(database, dynamicQueryMapping, query);
            return(dynamicQueryMapping);
        }
Ejemplo n.º 17
0
        private void CreateIndex(DynamicQueryMapping map, string indexName)
        {
            if (documentDatabase.GetIndexDefinition(indexName) != null) // avoid race condition when creating the index
                return;

            var definition = map.CreateIndexDefinition();

            documentDatabase.PutIndex(indexName, definition);
        }
Ejemplo n.º 18
0
		private static IndexQuery CreateIndexQuery(IndexQuery query, DynamicQueryMapping map, string realQuery)
		{
			var indexQuery = new IndexQuery
			{
				Cutoff = query.Cutoff,
				PageSize = query.PageSize,
				Query = realQuery,
				Start = query.Start,
				FieldsToFetch = query.FieldsToFetch,
				GroupBy = query.GroupBy,
				AggregationOperation = query.AggregationOperation,
				SortedFields = query.SortedFields,
				DefaultField = query.DefaultField,
				CutoffEtag = query.CutoffEtag,
				DebugOptionGetIndexEntries = query.DebugOptionGetIndexEntries,
				DefaultOperator = query.DefaultOperator,
				SkipTransformResults = query.SkipTransformResults,
				SkippedResults = query.SkippedResults,
				HighlighterPreTags = query.HighlighterPreTags,
				HighlighterPostTags = query.HighlighterPostTags,
				HighlightedFields = query.HighlightedFields,
				ResultsTransformer = query.ResultsTransformer,
				QueryInputs = query.QueryInputs
			};
			if (indexQuery.SortedFields == null)
				return indexQuery;

			for (int index = 0; index < indexQuery.SortedFields.Length; index++)
			{
				var sortedField = indexQuery.SortedFields[index];
				var fieldName = sortedField.Field;
				bool hasRange = false;
				if (fieldName.EndsWith("_Range"))
				{
					fieldName = fieldName.Substring(0, fieldName.Length - "_Range".Length);
					hasRange = true;
				}
			
				var item = map.Items.FirstOrDefault(x => string.Equals(x.QueryFrom, fieldName, StringComparison.InvariantCultureIgnoreCase));
				if (item == null)
					continue;

				indexQuery.SortedFields[index] = new SortedField(hasRange ? item.To + "_Range" : item.To);
				indexQuery.SortedFields[index].Descending = sortedField.Descending;
			}
			return indexQuery;
		}
Ejemplo n.º 19
0
        public void CreateDefinitionSupportsNestedProperties()
        {
            Data.DynamicQueryMapping mapping = new Data.DynamicQueryMapping()
            {
                Items = new Data.DynamicQueryMappingItem[]{
                        new Data.DynamicQueryMappingItem(){
                             From = "User.Name",
                             To = "UserName"
                        }
                 }
            };

            var definition = mapping.CreateIndexDefinition();
            Assert.Equal("from doc in docs\r\nselect new { UserName = doc.User.Name }", definition.Map);
        }
Ejemplo n.º 20
0
		private Tuple<string, bool> GetAppropriateIndexToQuery(string entityName, IndexQuery query, DynamicQueryMapping map)
		{
			var appropriateIndex = new DynamicQueryOptimizer(documentDatabase).SelectAppropriateIndex(entityName, query);
			if (appropriateIndex.MatchType == DynamicQueryMatchType.Complete)
			{
			    map.IndexName = appropriateIndex.IndexName;
				return Tuple.Create(appropriateIndex.IndexName, false);
			}
            else if (appropriateIndex.MatchType == DynamicQueryMatchType.Partial)
            {
                // At this point, we found an index that has some fields we need and
                // isn't incompatible with anything else we're asking for
                // We need to clone that other index 
                // We need to add all our requested indexes information to our cloned index
                // We can then use our new index instead
                var currentIndex = documentDatabase.IndexDefinitionStorage.GetIndexDefinition(appropriateIndex.IndexName);
                map.AddExistingIndexDefinition(currentIndex, documentDatabase, query);
            }
			return CreateAutoIndex(map.IndexName, map.CreateIndexDefinition);
		}
Ejemplo n.º 21
0
		private void FindIndexName(DocumentDatabase database, DynamicQueryMapping map, IndexQuery query)
		{
			var targetName = map.ForEntityName ?? "AllDocs";

			var combinedFields = String.Join("And",
				map.Items
				.OrderBy(x => x.To)
				.Select(x => x.To));
			var indexName = combinedFields;

			if (map.SortDescriptors != null && map.SortDescriptors.Length > 0)
			{
				indexName = string.Format("{0}SortBy{1}", indexName,
										  String.Join("",
													  map.SortDescriptors
														  .Select(x => x.Field)
														  .OrderBy(x => x)));
			}
			if (map.HighlightedFields != null && map.HighlightedFields.Length > 0)
			{
				indexName = string.Format("{0}Highlight{1}", indexName,
					string.Join("", map.HighlightedFields.OrderBy(x => x)));
			}
			string groupBy = null;

			if (database.Configuration.RunInUnreliableYetFastModeThatIsNotSuitableForProduction == false &&
				database.Configuration.RunInMemory == false)
			{
				indexName = IndexingUtil.FixupIndexName(indexName, database.Configuration.DataDirectory);
			}

			var permanentIndexName = indexName.Length == 0
					? string.Format("Auto/{0}{1}", targetName, groupBy)
					: string.Format("Auto/{0}/By{1}{2}", targetName, indexName, groupBy);

			map.IndexName = permanentIndexName;
		}
Ejemplo n.º 22
0
		public static DynamicQueryMapping Create(DocumentDatabase database, IndexQuery query, string entityName)
		{
			var fields = SimpleQueryParser.GetFieldsForDynamicQuery(query);

			if (query.SortedFields != null)
			{
				foreach (var sortedField in query.SortedFields)
				{
					var field = sortedField.Field;
					if (field.StartsWith(Constants.RandomFieldName))
						continue;
					if (field == Constants.TemporaryScoreValue)
						continue;

					if (field.EndsWith("_Range"))
						field = field.Substring(0, field.Length - "_Range".Length);

					fields.Add(Tuple.Create(SimpleQueryParser.TranslateField(field), field));
				}
			}

			var dynamicQueryMapping = new DynamicQueryMapping
			{
				ForEntityName = entityName,
				HighlightedFields = query.HighlightedFields.EmptyIfNull().Select(x => x.Field).ToArray(),
				SortDescriptors = GetSortInfo(fieldName =>
				{
					if (fields.Any(x => x.Item2 == fieldName || x.Item2 == (fieldName + "_Range")) == false)
						fields.Add(Tuple.Create(fieldName, fieldName));
				}, query)
			};
			dynamicQueryMapping.SetupFieldsToIndex(query, fields);
			dynamicQueryMapping.SetupSortDescriptors(dynamicQueryMapping.SortDescriptors);
			dynamicQueryMapping.FindIndexName(database, dynamicQueryMapping, query);
			return dynamicQueryMapping;
		}
Ejemplo n.º 23
0
        private void FindIndexName(DocumentDatabase database, DynamicQueryMapping map, IndexQuery query)
        {
            var targetName = map.ForEntityName ?? "AllDocs";

            var combinedFields = String.Join("And",
                                             map.Items
                                             .OrderBy(x => x.To)
                                             .Select(x => x.To));
            var indexName = combinedFields;

            if (map.SortDescriptors != null && map.SortDescriptors.Length > 0)
            {
                indexName = string.Format("{0}SortBy{1}", indexName,
                                          String.Join("",
                                                      map.SortDescriptors
                                                      .Select(x => x.Field)
                                                      .OrderBy(x => x)));
            }
            if (map.HighlightedFields != null && map.HighlightedFields.Length > 0)
            {
                indexName = string.Format("{0}Highlight{1}", indexName,
                                          string.Join("", map.HighlightedFields.OrderBy(x => x)));
            }
            string groupBy = null;

            if (AggregationOperation != AggregationOperation.None)
            {
                if (query.GroupBy != null && query.GroupBy.Length > 0)
                {
                    groupBy += "/" + AggregationOperation + "By" + string.Join("And", query.GroupBy);
                }
                else
                {
                    groupBy += "/" + AggregationOperation;
                }
                if (DynamicAggregation)
                {
                    groupBy += "Dynamically";
                }
            }

            if (database.Configuration.RunInUnreliableYetFastModeThatIsNotSuitableForProduction == false &&
                database.Configuration.RunInMemory == false)
            {
                // Hash the name if it's too long (as a path)
                if ((database.Configuration.DataDirectory.Length + indexName.Length) > 230)
                {
                    using (var sha256 = SHA256.Create())
                    {
                        var bytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(indexName));
                        indexName = Convert.ToBase64String(bytes);
                    }
                }
            }

            var permanentIndexName = indexName.Length == 0
                                        ? string.Format("Auto/{0}{1}", targetName, groupBy)
                                        : string.Format("Auto/{0}/By{1}{2}", targetName, indexName, groupBy);

            var temporaryIndexName = indexName.Length == 0
                                        ? string.Format("Temp/{0}{1}", targetName, groupBy)
                                        : string.Format("Temp/{0}/By{1}{2}", targetName, indexName, groupBy);


            map.IndexName = permanentIndexName;
        }
Ejemplo n.º 24
0
		private void FindIndexName(DocumentDatabase database, DynamicQueryMapping map, IndexQuery query)
		{
			var targetName = map.ForEntityName ?? "AllDocs";

			var combinedFields = String.Join("And",
				map.Items
				.OrderBy(x => x.To)
				.Select(x => x.To));
			var indexName = combinedFields;

			if (map.SortDescriptors != null && map.SortDescriptors.Length > 0)
			{
				indexName = string.Format("{0}SortBy{1}", indexName,
										  String.Join("",
													  map.SortDescriptors
														  .Select(x => x.Field)
														  .OrderBy(x => x)));
			}
			if (map.HighlightedFields != null && map.HighlightedFields.Length > 0)
			{
				indexName = string.Format("{0}Highlight{1}", indexName,
					string.Join("", map.HighlightedFields.OrderBy(x => x)));
			}
			string groupBy = null;
			if (AggregationOperation != AggregationOperation.None)
			{
				if (query.GroupBy != null && query.GroupBy.Length > 0)
				{
					groupBy += "/" + AggregationOperation + "By" + string.Join("And", query.GroupBy);
				}
				else
				{
					groupBy += "/" + AggregationOperation;
				}
				if (DynamicAggregation)
					groupBy += "Dynamically";
			}

			if (database.Configuration.RunInUnreliableYetFastModeThatIsNotSuitableForProduction == false &&
				database.Configuration.RunInMemory == false)
			{
				// Hash the name if it's too long (as a path)
				if ((database.Configuration.DataDirectory.Length + indexName.Length) > 230)
				{
					using (var sha256 = SHA256.Create())
					{
						var bytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(indexName));
						indexName = Convert.ToBase64String(bytes);
					}
				}
			}

			var permanentIndexName = indexName.Length == 0
					? string.Format("Auto/{0}{1}", targetName, groupBy)
					: string.Format("Auto/{0}/By{1}{2}", targetName, indexName, groupBy);

			var temporaryIndexName = indexName.Length == 0
					? string.Format("Temp/{0}{1}", targetName, groupBy)
					: string.Format("Temp/{0}/By{1}{2}", targetName, indexName, groupBy);


			// If there is a permanent index, then use that without bothering anything else
			var permanentIndex = database.GetIndexDefinition(permanentIndexName);
			map.PermanentIndexName = permanentIndexName;
			map.TemporaryIndexName = temporaryIndexName;
			map.IndexName = permanentIndex != null ? permanentIndexName : temporaryIndexName;
		}
Ejemplo n.º 25
0
		public static DynamicQueryMapping Create(DocumentDatabase database, IndexQuery query, string entityName)
		{
			var fields = SimpleQueryParser.GetFieldsForDynamicQuery(query);

			if (query.SortedFields != null)
			{
				foreach (var sortedField in query.SortedFields)
				{
					if (sortedField.Field.StartsWith(Constants.RandomFieldName))
						continue;
					if (sortedField.Field == Constants.TemporaryScoreValue)
						continue;
					fields.Add(Tuple.Create(sortedField.Field, sortedField.Field));
				}
			}

			var dynamicQueryMapping = new DynamicQueryMapping
			{
				AggregationOperation = query.AggregationOperation.RemoveOptionals(),
				DynamicAggregation = query.AggregationOperation.HasFlag(AggregationOperation.Dynamic),
				ForEntityName = entityName,
				HighlightedFields = query.HighlightedFields.EmptyIfNull().Select(x=>x.Field).ToArray(),
				SortDescriptors = GetSortInfo(fieldName =>
				{
					if (fields.Any(x => x.Item2 == fieldName || x.Item2 == (fieldName + "_Range")) == false)
						fields.Add(Tuple.Create(fieldName, fieldName));
				})
			};
			dynamicQueryMapping.SetupFieldsToIndex(query, fields);
			dynamicQueryMapping.SetupSortDescriptors(dynamicQueryMapping.SortDescriptors);
			dynamicQueryMapping.FindIndexName(database, dynamicQueryMapping, query);
			return dynamicQueryMapping;
		}
Ejemplo n.º 26
0
		public static DynamicQueryMapping Create(DocumentDatabase database, IndexQuery query, string entityName)
		{
			var fields = SimpleQueryParser.GetFieldsForDynamicQuery(query.Query);

			if(query.SortedFields != null)
			{
				foreach (var sortedField in query.SortedFields)
				{
					fields.Add(Tuple.Create(sortedField.Field, sortedField.Field));
				}
			}

			var dynamicQueryMapping = new DynamicQueryMapping
			{
				AggregationOperation = query.AggregationOperation & ~AggregationOperation.Dynamic,
				DynamicAggregation = (query.AggregationOperation & AggregationOperation.Dynamic) == AggregationOperation.Dynamic,
				ForEntityName = entityName,
				SortDescriptors = GetSortInfo(fields)
			};
			dynamicQueryMapping.SetupFieldsToIndex(query, fields);
			dynamicQueryMapping.FindIndexName(database, dynamicQueryMapping, query);
			return dynamicQueryMapping;
		}
Ejemplo n.º 27
0
 private string TouchTemporaryIndex(DynamicQueryMapping map, string temporaryIndexName, string permanentIndexName)
 {
     var indexInfo = temporaryIndexes.GetOrAdd(temporaryIndexName, s => new TemporaryIndexInfo
     {
         Created = DateTime.Now,
         RunCount = 0,
         Name = temporaryIndexName
     });
     indexInfo.LastRun = DateTime.Now;
     indexInfo.RunCount++;
     
     if (TemporaryIndexShouldBeMadePermanent(indexInfo))
     {
         documentDatabase.DeleteIndex(temporaryIndexName);
         CreateIndex(map, permanentIndexName);
         TemporaryIndexInfo ignored;
         temporaryIndexes.TryRemove(temporaryIndexName, out ignored);
         return permanentIndexName;
     }
     var temporaryIndex = documentDatabase.GetIndexDefinition(temporaryIndexName);
     if (temporaryIndex != null)
         return temporaryIndexName;
     CreateIndex(map, temporaryIndexName);
     return temporaryIndexName;
 }
Ejemplo n.º 28
0
		public static DynamicQueryMapping Create(DocumentDatabase database, IndexQuery query, string entityName)
		{
			var fields = SimpleQueryParser.GetFieldsForDynamicQuery(query.Query);

			if(query.SortedFields != null)
			{
				foreach (var sortedField in query.SortedFields)
				{
					fields.Add(Tuple.Create(sortedField.Field, sortedField.Field));
				}
			}

			var dynamicQueryMapping = new DynamicQueryMapping
			{
				AggregationOperation = query.AggregationOperation.RemoveOptionals(),
				DynamicAggregation = query.AggregationOperation.HasFlag(AggregationOperation.Dynamic),
				ForEntityName = entityName,
				SortDescriptors = GetSortInfo(fieldName =>
				{
					if (fields.Any(x => x.Item2 == fieldName || x.Item2 == (fieldName + "_Range")) == false)
						fields.Add(Tuple.Create(fieldName, fieldName));
				})
			};
			dynamicQueryMapping.SetupFieldsToIndex(query, fields);
			dynamicQueryMapping.FindIndexName(database, dynamicQueryMapping, query);
			return dynamicQueryMapping;
		}
Ejemplo n.º 29
0
		private void FindIndexName(DocumentDatabase database, DynamicQueryMapping map, IndexQuery query)
		{
			var targetName = map.ForEntityName ?? "AllDocs";

			var combinedFields = String.Join("And",
				map.Items
				.OrderBy(x => x.To)
				.Select(x => x.To));
			var indexName = combinedFields;

			if (map.SortDescriptors != null && map.SortDescriptors.Length > 0)
			{
				indexName = string.Format("{0}SortBy{1}", indexName,
										  String.Join("",
													  map.SortDescriptors
														  .Select(x => x.Field)
														  .OrderBy(x => x)));
			}
			if (map.HighlightedFields != null && map.HighlightedFields.Length > 0)
			{
				indexName = string.Format("{0}Highlight{1}", indexName,
					string.Join("", map.HighlightedFields.OrderBy(x => x)));
			}
			string groupBy = null;

			if (database.Configuration.RunInUnreliableYetFastModeThatIsNotSuitableForProduction == false &&
				database.Configuration.RunInMemory == false)
			{
				// Hash the name if it's too long (as a path)
				if ((database.Configuration.DataDirectory.Length + indexName.Length) > 230)
				{
					using (var sha256 = SHA256.Create())
					{
						var bytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(indexName));
						indexName = Convert.ToBase64String(bytes);
					}
				}
			}

			var permanentIndexName = indexName.Length == 0
					? string.Format("Auto/{0}{1}", targetName, groupBy)
					: string.Format("Auto/{0}/By{1}{2}", targetName, indexName, groupBy);

			var temporaryIndexName = indexName.Length == 0
					? string.Format("Temp/{0}{1}", targetName, groupBy)
					: string.Format("Temp/{0}/By{1}{2}", targetName, indexName, groupBy);


			map.IndexName = permanentIndexName;
		}