예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
 public IndexVisitor(IndexData indexData)
 {
     this.indexData = indexData;
     indexData.NumberOfFromClauses = 0;
     indexData.SelectExpressions = new Dictionary<string, Expression>();
    
 }
예제 #4
0
        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);
        }
예제 #5
0
 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;
 }
예제 #6
0
 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);
 }
예제 #7
0
        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);
        }
예제 #8
0
        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;
        }
예제 #9
0
        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);
        }
예제 #10
0
 public IndexVisitor(IndexData indexData)
 {
     this.indexData = indexData;
     indexData.NumberOfFromClauses = 0;
     indexData.SelectExpressions   = new Dictionary <string, Expression>();
 }