blob: f1e96dd78eb627763e21ca7c1e0bb9602820e8a4 [file] [log] [blame]
using J2N.Text;
using Lucene.Net.Benchmarks.ByTask.Feeds;
using Lucene.Net.Search;
using System;
namespace Lucene.Net.Benchmarks.ByTask.Tasks
{
/*
* 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>
/// Does sort search on specified field.
/// </summary>
public class SearchWithSortTask : ReadTask
{
private bool doScore = true;
private bool doMaxScore = true;
private Sort sort;
public SearchWithSortTask(PerfRunData runData)
: base(runData)
{
}
/// <summary>
/// SortFields: field:type,field:type[,noscore][,nomaxscore]
/// <para/>
/// If noscore is present, then we turn off score tracking
/// in <see cref="TopFieldCollector"/>.
/// If nomaxscore is present, then we turn off maxScore tracking
/// in <see cref="TopFieldCollector"/>.
/// <para/>
/// name:string,page:int,subject:string
/// </summary>
public override void SetParams(string sortField)
{
base.SetParams(sortField);
string[] fields = sortField.Split(',').TrimEnd();
SortField[] sortFields = new SortField[fields.Length];
int upto = 0;
for (int i = 0; i < fields.Length; i++)
{
string field = fields[i];
SortField sortField0;
if (field.Equals("doc", StringComparison.Ordinal))
{
sortField0 = SortField.FIELD_DOC;
}
else if (field.Equals("score", StringComparison.Ordinal))
{
sortField0 = SortField.FIELD_SCORE;
}
else if (field.Equals("noscore", StringComparison.Ordinal))
{
doScore = false;
continue;
}
else if (field.Equals("nomaxscore", StringComparison.Ordinal))
{
doMaxScore = false;
continue;
}
else
{
int index = field.LastIndexOf(':');
string fieldName;
string typeString;
if (index != -1)
{
fieldName = field.Substring(0, index - 0);
typeString = field.Substring(1 + index, field.Length - (1 + index));
}
else
{
throw new Exception("You must specify the sort type ie page:int,subject:string");
}
sortField0 = new SortField(fieldName, (SortFieldType)Enum.Parse(typeof(SortFieldType), typeString, true));
}
sortFields[upto++] = sortField0;
}
if (upto < sortFields.Length)
{
SortField[] newSortFields = new SortField[upto];
System.Array.Copy(sortFields, 0, newSortFields, 0, upto);
sortFields = newSortFields;
}
this.sort = new Sort(sortFields);
}
public override bool SupportsParams
{
get { return true; }
}
public override IQueryMaker GetQueryMaker()
{
return RunData.GetQueryMaker(this);
}
public override bool WithRetrieve
{
get { return false; }
}
public override bool WithSearch
{
get { return true; }
}
public override bool WithTraverse
{
get { return false; }
}
public override bool WithWarm
{
get { return false; }
}
public override bool WithScore
{
get { return doScore; }
}
public override bool WithMaxScore
{
get { return doMaxScore; }
}
public override Sort Sort
{
get
{
if (sort == null)
{
throw new InvalidOperationException("No sort field was set");
}
return sort;
}
}
}
}