﻿namespace Lucene.Net.Codecs.SimpleText
{
    /*
     * 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.
     */

    using FieldInfos = Index.FieldInfos;
    using SegmentInfo = Index.SegmentInfo;
    using Directory = Store.Directory;
    using IOContext = Store.IOContext;

    /// <summary>
    /// Plain text term vectors format.
    /// <para>
    /// <b><font color="red">FOR RECREATIONAL USE ONLY</font></b>
    /// </para>
    /// @lucene.experimental
    /// </summary>
    public class SimpleTextTermVectorsFormat : TermVectorsFormat
    {
        public override TermVectorsReader VectorsReader(Directory directory, SegmentInfo segmentInfo,
            FieldInfos fieldInfos, IOContext context)
        {
            return new SimpleTextTermVectorsReader(directory, segmentInfo, context);
        }

        public override TermVectorsWriter VectorsWriter(Directory directory, SegmentInfo segmentInfo, IOContext context)
        {
            return new SimpleTextTermVectorsWriter(directory, segmentInfo.Name, context);
        }
    }
}