blob: c8982fd3aca6f18d6ebb6eb1ce088bf454c833cd [file] [log] [blame]
using ICU4N.Text;
using Lucene.Net.Documents;
using Lucene.Net.Index;
using Lucene.Net.Search;
using Lucene.Net.Store;
using Lucene.Net.Util;
using NUnit.Framework;
using System;
using System.Globalization;
namespace Lucene.Net.Collation
{
/*
* 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>
/// trivial test of ICUCollationDocValuesField
/// </summary>
[SuppressCodecs("Lucene3x")]
public class TestICUCollationDocValuesField : LuceneTestCase
{
[Test]
public void TestBasic()
{
Directory dir = NewDirectory();
RandomIndexWriter iw = new RandomIndexWriter(
#if FEATURE_INSTANCE_TESTDATA_INITIALIZATION
this,
#endif
Random, dir);
Document doc = new Document();
Field field = NewField("field", "", StringField.TYPE_STORED);
ICUCollationDocValuesField collationField = new ICUCollationDocValuesField("collated", Collator.GetInstance(new CultureInfo("en")));
doc.Add(field);
doc.Add(collationField);
field.SetStringValue("ABC");
collationField.SetStringValue("ABC");
iw.AddDocument(doc);
field.SetStringValue("abc");
collationField.SetStringValue("abc");
iw.AddDocument(doc);
IndexReader ir = iw.GetReader();
iw.Dispose();
IndexSearcher @is = NewSearcher(ir);
SortField sortField = new SortField("collated", SortFieldType.STRING);
TopDocs td = @is.Search(new MatchAllDocsQuery(), 5, new Sort(sortField));
assertEquals("abc", ir.Document(td.ScoreDocs[0].Doc).Get("field"));
assertEquals("ABC", ir.Document(td.ScoreDocs[1].Doc).Get("field"));
ir.Dispose();
dir.Dispose();
}
[Test]
public void TestRanges()
{
Directory dir = NewDirectory();
RandomIndexWriter iw = new RandomIndexWriter(
#if FEATURE_INSTANCE_TESTDATA_INITIALIZATION
this,
#endif
Random, dir);
Document doc = new Document();
Field field = NewField("field", "", StringField.TYPE_STORED);
Collator collator = Collator.GetInstance(CultureInfo.CurrentCulture); // uses -Dtests.locale
if (Random.nextBoolean())
{
collator.Strength = CollationStrength.Primary;
}
ICUCollationDocValuesField collationField = new ICUCollationDocValuesField("collated", collator);
doc.Add(field);
doc.Add(collationField);
int numDocs = AtLeast(500);
for (int i = 0; i < numDocs; i++)
{
String value = TestUtil.RandomSimpleString(Random);
field.SetStringValue(value);
collationField.SetStringValue(value);
iw.AddDocument(doc);
}
IndexReader ir = iw.GetReader();
iw.Dispose();
IndexSearcher @is = NewSearcher(ir);
int numChecks = AtLeast(100);
for (int i = 0; i < numChecks; i++)
{
String start = TestUtil.RandomSimpleString(Random);
String end = TestUtil.RandomSimpleString(Random);
BytesRef lowerVal = new BytesRef(collator.GetCollationKey(start).ToByteArray());
BytesRef upperVal = new BytesRef(collator.GetCollationKey(end).ToByteArray());
Query query = new ConstantScoreQuery(FieldCacheRangeFilter.NewBytesRefRange("collated", lowerVal, upperVal, true, true));
DoTestRanges(@is, start, end, query, collator);
}
ir.Dispose();
dir.Dispose();
}
private void DoTestRanges(IndexSearcher @is, String startPoint, String endPoint, Query query, Collator collator)
{
QueryUtils.Check(query);
// positive test
TopDocs docs = @is.Search(query, @is.IndexReader.MaxDoc);
foreach (ScoreDoc doc in docs.ScoreDocs)
{
String value = @is.Doc(doc.Doc).Get("field");
assertTrue(collator.Compare(value, startPoint) >= 0);
assertTrue(collator.Compare(value, endPoint) <= 0);
}
// negative test
BooleanQuery bq = new BooleanQuery();
bq.Add(new MatchAllDocsQuery(), Occur.SHOULD);
bq.Add(query, Occur.MUST_NOT);
docs = @is.Search(bq, @is.IndexReader.MaxDoc);
foreach (ScoreDoc doc in docs.ScoreDocs)
{
String value = @is.Doc(doc.Doc).Get("field");
assertTrue(collator.Compare(value, startPoint) < 0 || collator.Compare(value, endPoint) > 0);
}
}
}
}