示例#1
0
        /// <summary>Rewrites the wrapped query. </summary>
        public override Query Rewrite(IndexReader reader)
        {
            Query rewritten = query.Rewrite(reader);

            if (rewritten != query)
            {
                FilteredQuery clone = (FilteredQuery)this.Clone();
                clone.query = rewritten;
                return(clone);
            }
            else
            {
                return(this);
            }
        }
示例#2
0
        /// <summary>Optimize our representation and our subqueries representations</summary>
        /// <param name="reader">the IndexReader we query
        /// </param>
        /// <returns> an optimized copy of us (which may not be a copy if there is nothing to optimize)
        /// </returns>
        public override Query Rewrite(IndexReader reader)
        {
            int numDisjunctions = disjuncts.Count;

            if (numDisjunctions == 1)
            {
                Query singleton = (Query)disjuncts[0];
                Query result    = singleton.Rewrite(reader);
                if (GetBoost() != 1.0f)
                {
                    if (result == singleton)
                    {
                        result = (Query)result.Clone();
                    }
                    result.SetBoost(GetBoost() * result.GetBoost());
                }
                return(result);
            }
            DisjunctionMaxQuery clone = null;

            for (int i = 0; i < numDisjunctions; i++)
            {
                Query clause  = (Query)disjuncts[i];
                Query rewrite = clause.Rewrite(reader);
                if (rewrite != clause)
                {
                    if (clone == null)
                    {
                        clone = (DisjunctionMaxQuery)this.Clone();
                    }
                    clone.disjuncts[i] = rewrite;
                }
            }
            if (clone != null)
            {
                return(clone);
            }
            else
            {
                return(this);
            }
        }