bingo/sqlserver/Source/RingoFastIndexFetch.cs (63 lines of code) (raw):
using System.IO;
using System;
using System.Collections.Generic;
using System.Collections;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.Runtime.Serialization.Formatters.Binary;
namespace indigo
{
public class RingoFastIndexFetch
{
RingoIndexData _index_data;
bool highlighting;
public int? nextAfterStorageId { get; set; }
public RingoFastIndexFetch (RingoIndexData index_data)
{
_index_data = index_data;
}
public void prepareSub (string query, string options, bool highlighting, bool smarts)
{
int res = BingoCore.lib.ringoSetupMatch(smarts ? "RSMARTS" : "RSUB", query, options);
if (res < 0)
throw new Exception(BingoCore.lib.bingoGetError());
BingoCore.lib.ringoSetHightlightingMode(highlighting ? 1 : 0);
this.highlighting = highlighting;
}
public IEnumerable<FetchedData> fetch (SqlConnection conn)
{
byte[] fp;
BingoCore.ringoGetQueryFingerprint(out fp);
// Search using fast index
_index_data.fingerprints.init(conn);
_index_data.storage.validate(conn);
IEnumerable<int> screened;
if (!_index_data.fingerprints.ableToScreen(fp))
screened = _index_data.storage.enumerateStorageIds(nextAfterStorageId);
else
screened = _index_data.fingerprints.screenSub(conn, fp, nextAfterStorageId);
int cache_index = 0;
foreach (int storage_id in screened)
{
if (_index_data.storage.isDeleted(storage_id, conn, ref cache_index))
continue;
byte[] data_with_cmf = _index_data.storage.get(storage_id, 4, -1, conn, ref cache_index);
int ret = BingoCore.lib.ringoMatchTargetBinary(data_with_cmf,
data_with_cmf.Length);
if (ret == -2)
throw new Exception(BingoCore.lib.bingoGetError());
if (ret == -1)
throw new Exception(BingoCore.lib.bingoGetWarning());
if (ret == 1)
{
int id = _index_data.storage.getInt(storage_id, 0, conn, ref cache_index);
FetchedData data = new FetchedData(id);
if (highlighting)
data.str = BingoCore.ringoGetHightlightedReaction();
yield return data;
}
}
}
}
}