blob: eb5d2b4de7994bb2202663b41c64d9a837f9a9f9 [file] [log] [blame]
using Lucene.Net.Analysis;
using Lucene.Net.Analysis.TokenAttributes;
using Lucene.Net.Documents;
using Lucene.Net.Index.Extensions;
using NUnit.Framework;
using System;
using System.IO;
namespace Lucene.Net.Search.Payloads
{
/*
* 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 BytesRef = Lucene.Net.Util.BytesRef;
using Directory = Lucene.Net.Store.Directory;
using DirectoryReader = Lucene.Net.Index.DirectoryReader;
using Document = Documents.Document;
using English = Lucene.Net.Util.English;
using Field = Field;
using IndexReader = Lucene.Net.Index.IndexReader;
using IndexWriter = Lucene.Net.Index.IndexWriter;
using IndexWriterConfig = Lucene.Net.Index.IndexWriterConfig;
using LuceneTestCase = Lucene.Net.Util.LuceneTestCase;
using MockDirectoryWrapper = Lucene.Net.Store.MockDirectoryWrapper;
using RAMDirectory = Lucene.Net.Store.RAMDirectory;
using Similarity = Lucene.Net.Search.Similarities.Similarity;
using TextField = TextField;
///
///
///
public class PayloadHelper
{
private readonly byte[] payloadField = new byte[] { 1 };
private readonly byte[] payloadMultiField1 = new byte[] { 2 };
private readonly byte[] payloadMultiField2 = new byte[] { 4 };
public const string NO_PAYLOAD_FIELD = "noPayloadField";
public const string MULTI_FIELD = "multiField";
public const string FIELD = "field";
public IndexReader Reader;
public sealed class PayloadAnalyzer : Analyzer
{
private readonly PayloadHelper outerInstance;
public PayloadAnalyzer(PayloadHelper outerInstance)
: base(PER_FIELD_REUSE_STRATEGY)
{
this.outerInstance = outerInstance;
}
protected internal override TokenStreamComponents CreateComponents(string fieldName, TextReader reader)
{
Tokenizer result = new MockTokenizer(reader, MockTokenizer.SIMPLE, true);
return new TokenStreamComponents(result, new PayloadFilter(outerInstance, result, fieldName));
}
}
public sealed class PayloadFilter : TokenFilter
{
private readonly PayloadHelper outerInstance;
internal readonly string fieldName;
internal int numSeen = 0;
internal readonly IPayloadAttribute payloadAtt;
public PayloadFilter(PayloadHelper outerInstance, TokenStream input, string fieldName)
: base(input)
{
this.outerInstance = outerInstance;
this.fieldName = fieldName;
payloadAtt = AddAttribute<IPayloadAttribute>();
}
public override bool IncrementToken()
{
if (m_input.IncrementToken())
{
if (fieldName.Equals(FIELD, StringComparison.Ordinal))
{
payloadAtt.Payload = new BytesRef(outerInstance.payloadField);
}
else if (fieldName.Equals(MULTI_FIELD, StringComparison.Ordinal))
{
if (numSeen % 2 == 0)
{
payloadAtt.Payload = new BytesRef(outerInstance.payloadMultiField1);
}
else
{
payloadAtt.Payload = new BytesRef(outerInstance.payloadMultiField2);
}
numSeen++;
}
return true;
}
return false;
}
public override void Reset()
{
base.Reset();
this.numSeen = 0;
}
}
/// <summary>
/// Sets up a RAMDirectory, and adds documents (using English.IntToEnglish()) with two fields: field and multiField
/// and analyzes them using the PayloadAnalyzer </summary>
/// <param name="similarity"> The Similarity class to use in the Searcher </param>
/// <param name="numDocs"> The num docs to add </param>
/// <returns> An IndexSearcher </returns>
// TODO: randomize
public virtual IndexSearcher SetUp(Random random, Similarity similarity, int numDocs)
{
Directory directory = new MockDirectoryWrapper(random, new RAMDirectory());
PayloadAnalyzer analyzer = new PayloadAnalyzer(this);
// TODO randomize this
IndexWriter writer = new IndexWriter(directory, new IndexWriterConfig(LuceneTestCase.TEST_VERSION_CURRENT, analyzer).SetSimilarity(similarity));
// writer.infoStream = System.out;
for (int i = 0; i < numDocs; i++)
{
Document doc = new Document();
doc.Add(new TextField(FIELD, English.Int32ToEnglish(i), Field.Store.YES));
doc.Add(new TextField(MULTI_FIELD, English.Int32ToEnglish(i) + " " + English.Int32ToEnglish(i), Field.Store.YES));
doc.Add(new TextField(NO_PAYLOAD_FIELD, English.Int32ToEnglish(i), Field.Store.YES));
writer.AddDocument(doc);
}
Reader = DirectoryReader.Open(writer, true);
writer.Dispose();
IndexSearcher searcher = LuceneTestCase.NewSearcher(Reader);
searcher.Similarity = similarity;
return searcher;
}
[TearDown]
public virtual void TearDown()
{
Reader.Dispose();
}
}
}