📄 queryresults.cs
字号:
using System;
namespace SECompare.Structure
{
/// <summary>
/// Class QueryResults represents all the results generated from a certain query and search engine.
/// </summary>
public class QueryResults
{
private String mQuery;
private String mEngine;
private int mMaxLength; //max length of results list
private bool[] mFlags; //if the record ranked at i exists, mFlags[i]=true,.
public int Count
{
get
{
return QueryResults.GetMaxRank(this.mQuery,this.mEngine);
}
}
/// <summary>
/// Constructor.
/// </summary>
/// <param name="query">Query words</param>
/// <param name="engine">Search engine name</param>
/// <param name="maxLength">Max length of results, for example 1000.</param>
public QueryResults(String query,String engine,int maxLength)
{
this.mQuery = query;
this.mEngine = engine;
this.mMaxLength = maxLength;
this.mFlags = new bool[this.mMaxLength+1];
this.RefreshFlags();
}
public QueryResults(String query,EngineSet engine,int maxLength)
{
this.mQuery = query;
this.mEngine = EngineSetting.GetName(engine);
this.mMaxLength = maxLength;
this.mFlags = new bool[this.mMaxLength+1];
this.RefreshFlags();
}
public void RefreshFlags()
{
int maxRank = QueryResults.GetMaxRank(this.mQuery,this.mEngine);
int i;
for(i=1;i<=maxRank;i++)
{
this.mFlags[i]=true;
}
for(;i<=this.mMaxLength;i++)
{
this.mFlags[i]=false;
}
}
/// <summary>
/// Get next query range.
/// </summary>
/// <param name="start">the start rank of range to query</param>
/// <param name="length">the length of range</param>
/// <returns>true if there is some results haven't gotten yet, else false</returns>
public bool GetNextQueryRange(out int start,out int length)
{
start = 0;
length = 0;
int maxLength = EngineSetting.GetRecordPerQuery( EngineSetting.GetEnum(this.mEngine) );
for(int i=1;i<this.mMaxLength;i++)
{
int j;
for(j=0;j<maxLength;j++)
{
if((i+j)>this.mMaxLength)
{
//to the end of the list
start = i;
length = j;
return true;
}
if(this.mFlags[i+j]==true) break;
}
if(j==maxLength)
{
start = i;
length = maxLength;
return true;
}
}
return false;
}
/// <summary>
/// Get Max Rank of given query, using binary search.
/// </summary>
/// <param name="Query">Query Words</param>
/// <param name="EngineName">Engine Name</param>
/// <returns>Max Rank Number</returns>
public static int GetMaxRank(String Query,String EngineName)
{
if(!QueryRecord.Exists(Query,EngineName,1))
return 0;
if(QueryRecord.Exists(Query,EngineName,1000))
return 1000;
int low = 1, high = 1000, rank;
while(low<high)
{
rank = (low+high)/2;
//Return case:
if(QueryRecord.Exists(Query,EngineName,rank)
&&!QueryRecord.Exists(Query,EngineName,rank+1))
return rank;
if(QueryRecord.Exists(Query,EngineName,rank-1)
&&!QueryRecord.Exists(Query,EngineName,rank))
return rank-1;
//Scale down the range
//low is forever exist
if(QueryRecord.Exists(Query,EngineName,rank))
low = rank+1;
//high is forever not exist
if(!QueryRecord.Exists(Query,EngineName,rank))
high = rank-1;
}
return -1;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -