using Lucene.Net.QueryParsers.Flexible.Core.Builders;
using Lucene.Net.QueryParsers.Flexible.Core.Nodes;
using Lucene.Net.QueryParsers.Flexible.Standard.Builders;
using Lucene.Net.Search;

namespace Lucene.Net.QueryParsers.Flexible.Spans
{
    /*
     * Licensed to the Apache Software Foundation (ASF) under one or more
     * contributor license agreements.  See the NOTICE file distributed with
     * this work for additional information regarding copyright ownership.
     * The ASF licenses this file to You under the Apache License, Version 2.0
     * (the "License"); you may not use this file except in compliance with
     * the License.  You may obtain a copy of the License at
     *
     *     http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */

    /// <summary>
    /// Sets up a query tree builder to build a span query tree from a query node
    /// tree.
    /// <para/>
    /// The defined map is:
    /// - every BooleanQueryNode instance is delegated to the SpanOrQueryNodeBuilder
    /// - every FieldQueryNode instance is delegated to the SpanTermQueryNodeBuilder
    /// </summary>
    public class SpansQueryTreeBuilder : QueryTreeBuilder<Query>, IStandardQueryBuilder
    {
        public SpansQueryTreeBuilder()
        {
            SetBuilder(typeof(BooleanQueryNode), new SpanOrQueryNodeBuilder());
            SetBuilder(typeof(FieldQueryNode), new SpanTermQueryNodeBuilder());

        }

        public override Query Build(IQueryNode queryTree)
        {
            return base.Build(queryTree);
        }
    }
}
