private List <IndexData> ParseIndexesAndGetReadyToMerge() { var parser = new CSharpParser(); var indexes = new List <IndexData>(); foreach (var kvp in indexDefinitions) { var index = kvp.Value; var indexData = new IndexData(index) { IndexId = index.IndexId, IndexName = index.Name, OriginalMap = index.Map, }; indexes.Add(indexData); if (index.IsMapReduce || index.Maps.Count > 1) { indexData.IsMapReduceOrMultiMap = true; continue; } indexData.OriginalMap = IndexPrettyPrinter.Format(indexData.OriginalMap); Expression map = parser.ParseExpression(indexData.OriginalMap); var visitor = new IndexVisitor(indexData); map.AcceptVisitor(visitor); } return(indexes); }
private static bool AreSelectClausesTheSame(IndexData index, Dictionary <string, Expression> selectExpressionDict) { if (index.SelectExpressions.Count != selectExpressionDict.Count) { return(false); } foreach (var pair in index.SelectExpressions) { Expression expressionValue; if (selectExpressionDict.TryGetValue(pair.Key, out expressionValue) == false) { return(false); } // for the same key, they have to be the same string ySelectExpr = expressionValue.ToString(); string xSelectExpr = pair.Value.ToString(); if (xSelectExpr != ySelectExpr) { return(false); } } return(true); }
public IndexVisitor(IndexData indexData) { this.indexData = indexData; indexData.NumberOfFromClauses = 0; indexData.SelectExpressions = new Dictionary<string, Expression>(); }
private bool CanMergeIndexes(IndexData other, IndexData current) { if (current.IndexId == other.IndexId) return false; if (current.NumberOfFromClauses > 1) return false; if (current.NumberOfSelectClauses > 1) return false; if (current.HasWhere) return false; if (current.HasGroup) return false; if (current.HasOrder) return false; if (current.HasLet) return false; var currentFromExpression = current.FromExpression as MemberReferenceExpression; var otherFromExpression = other.FromExpression as MemberReferenceExpression; if (currentFromExpression != null || otherFromExpression != null) { if (currentFromExpression == null || otherFromExpression == null) return false; if (currentFromExpression.MemberName != otherFromExpression.MemberName) return false; } return CompareIndexFieldOptions(other, current); }
private static bool AreSelectClausesCompatible(IndexData x, IndexData y) { foreach (var pair in x.SelectExpressions) { Expression expressionValue; if (y.SelectExpressions.TryGetValue(pair.Key, out expressionValue) == false) continue; // for the same key, they have to be the same string ySelectExpr = expressionValue.ToString(); string xSelectExpr = pair.Value.ToString(); if (xSelectExpr != ySelectExpr) { return false; } } return true; }
private static bool AreSelectClausesCompatible(IndexData x, IndexData y) { foreach (var pair in x.SelectExpressions) { Expression expressionValue; if (y.SelectExpressions.TryGetValue(pair.Key, out expressionValue) == false) { continue; } // for the same key, they have to be the same string ySelectExpr = ExtractValueFromExpression(expressionValue); string xSelectExpr = ExtractValueFromExpression(pair.Value); if (xSelectExpr != ySelectExpr) { return(false); } } return(true); }
private static List <string> CheckForUnsuitableIndexForMerging(IndexData indexData) { var failComments = new List <string>(); if (indexData.Index.IsMapReduce) { failComments.Add("Cannot merge map/reduce indexes"); } if (indexData.Index.Maps.Count > 1) { failComments.Add("Cannot merge multi map indexes"); } if (indexData.NumberOfFromClauses > 1) { failComments.Add("Cannot merge indexes that have more than a single from clause"); } if (indexData.NumberOfSelectClauses > 1) { failComments.Add("Cannot merge indexes that have more than a single select clause"); } if (indexData.HasWhere) { failComments.Add("Cannot merge indexes that have a where clause"); } if (indexData.HasGroup) { failComments.Add("Cannot merge indexes that have a group by clause"); } if (indexData.HasLet) { failComments.Add("Cannot merge indexes that are using a let clause"); } if (indexData.HasOrder) { failComments.Add("Cannot merge indexes that have an order by clause"); } return(failComments); }
private bool CompareIndexFieldOptions(IndexData index1Data, IndexData index2Data) { string[] intersectNames = index2Data.SelectExpressions.Keys.Intersect(index1Data.SelectExpressions.Keys).ToArray(); if (DataDictionaryCompare(index1Data.Stores, index2Data.Stores, intersectNames) == false) return false; if (DataDictionaryCompare(index1Data.Analyzers, index2Data.Analyzers, intersectNames) == false) return false; if (DataDictionaryCompare(index1Data.Suggestions, index2Data.Suggestions, intersectNames) == false) return false; if (DataDictionaryCompare(index1Data.SortOptions, index2Data.SortOptions, intersectNames) == false) return false; if (DataDictionaryCompare(index1Data.Indexes, index2Data.Indexes, intersectNames) == false) return false; if (DataDictionaryCompare(index1Data.TermVectors, index2Data.TermVectors, intersectNames) == false) return false; if (DataDictionaryCompare(index1Data.SpatialIndexes, index2Data.SpatialIndexes, intersectNames) == false) return false; return true; }
private bool CompareIndexFieldOptions(IndexData index1Data, IndexData index2Data) { if (SortOptionsMatch(index1Data.SortOptions, index2Data.SortOptions) == false) { return(false); } string[] intersectNames = index2Data.SelectExpressions.Keys.Intersect(index1Data.SelectExpressions.Keys).ToArray(); if (DataDictionaryCompare(index1Data.Stores, index2Data.Stores, intersectNames) == false) { return(false); } if (DataDictionaryCompare(index1Data.Analyzers, index2Data.Analyzers, intersectNames) == false) { return(false); } if (SetExtensions.ContentEquals(index1Data.SuggestionsOptions, index2Data.SuggestionsOptions) == false) { return(false); } if (DataDictionaryCompare(index1Data.Indexes, index2Data.Indexes, intersectNames) == false) { return(false); } if (DataDictionaryCompare(index1Data.TermVectors, index2Data.TermVectors, intersectNames) == false) { return(false); } if (DataDictionaryCompare(index1Data.SpatialIndexes, index2Data.SpatialIndexes, intersectNames) == false) { return(false); } return(true); }
public IndexVisitor(IndexData indexData) { this.indexData = indexData; indexData.NumberOfFromClauses = 0; indexData.SelectExpressions = new Dictionary <string, Expression>(); }