Navigation Menu

Skip to content

Commit

Permalink
Implement pgroonga.keep_n_search_results mode
Browse files Browse the repository at this point in the history
It's disabled by default. It may not be needed.
  • Loading branch information
kou committed Apr 27, 2017
1 parent 44c840f commit fc63008
Show file tree
Hide file tree
Showing 4 changed files with 73 additions and 22 deletions.
1 change: 1 addition & 0 deletions src/pgrn-global.c
Expand Up @@ -4,6 +4,7 @@

grn_ctx PGrnContext;
struct PGrnBuffers PGrnBuffers;
int PGrnKeepNSearchResults = -1;

static grn_ctx *ctx = &PGrnContext;

Expand Down
1 change: 1 addition & 0 deletions src/pgrn-global.h
Expand Up @@ -30,6 +30,7 @@ struct PGrnBuffers

extern grn_ctx PGrnContext;
extern struct PGrnBuffers PGrnBuffers;
extern int PGrnKeepNSearchResults;

void PGrnInitializeBuffers(void);
void PGrnFinalizeBuffers(void);
15 changes: 15 additions & 0 deletions src/pgrn-variables.c
Expand Up @@ -314,5 +314,20 @@ PGrnInitializeVariables(void)
PGrnEnableWALAssign,
NULL);

PGrnDefineCustomIntVariable("pgroonga.keep_n_search_results",
"Keep N search results for pgroonga.score.",
"The default is -1. "
"It means that no search results are kept. "
"Normally, you don't change this.",
&PGrnKeepNSearchResults,
-1,
-1,
INT_MAX,
PGC_USERSET,
0,
NULL,
NULL,
NULL);

EmitWarningsOnPlaceholders("pgroonga");
}
78 changes: 56 additions & 22 deletions src/pgroonga.c
Expand Up @@ -109,9 +109,11 @@ typedef struct PGrnScanOpaqueData
grn_obj *scoreAccessor;
grn_id currentID;

slist_node node;
dlist_node node;
slist_head primaryKeyColumns;
grn_obj *scoreTargetRecords;

bool isScanEnd;
} PGrnScanOpaqueData;

typedef PGrnScanOpaqueData *PGrnScanOpaque;
Expand All @@ -130,7 +132,8 @@ typedef struct PGrnPrefixRKSequentialSearchData
grn_obj *resultTable;
} PGrnPrefixRKSequentialSearchData;

static slist_head PGrnScanOpaques = SLIST_STATIC_INIT(PGrnScanOpaques);
static dlist_head PGrnScanOpaques = DLIST_STATIC_INIT(PGrnScanOpaques);
static unsigned int PGrnNScanOpaques = 0;

extern PGDLLEXPORT void _PG_init(void);

Expand Down Expand Up @@ -253,6 +256,21 @@ PGrnEnsureDatabase(void)
}
}

static void PGrnScanOpaqueFin(PGrnScanOpaque so);

static void
PGrnFinalizeScanOpaques(void)
{
dlist_mutable_iter iter;

dlist_foreach_modify(iter, &PGrnScanOpaques)
{
PGrnScanOpaque so;
so = dlist_container(PGrnScanOpaqueData, node, iter.cur);
PGrnScanOpaqueFin(so);
}
}

static void
PGrnInitializeGroongaFunctions(void)
{
Expand Down Expand Up @@ -281,6 +299,8 @@ PGrnOnProcExit(int code, Datum arg)
{
grn_obj *db;

PGrnFinalizeScanOpaques();

PGrnFinalizeQueryExtractKeywords();

PGrnFinalizeMatchPositionsByte();
Expand Down Expand Up @@ -1118,13 +1138,13 @@ static double
PGrnCollectScore(Relation table, HeapTuple tuple)
{
double score = 0.0;
slist_iter iter;
dlist_iter iter;

slist_foreach(iter, &PGrnScanOpaques)
dlist_foreach(iter, &PGrnScanOpaques)
{
PGrnScanOpaque so;

so = slist_container(PGrnScanOpaqueData, node, iter.cur);
so = dlist_container(PGrnScanOpaqueData, node, iter.cur);
score += PGrnCollectScoreScanOpaque(table, tuple, so);
}

Expand All @@ -1147,7 +1167,7 @@ pgroonga_score(PG_FUNCTION_ARGS)
recordType = HeapTupleHeaderGetTypMod(header);
desc = lookup_rowtype_tupdesc(type, recordType);

if (desc->natts > 0 && !slist_is_empty(&PGrnScanOpaques))
if (desc->natts > 0 && !dlist_is_empty(&PGrnScanOpaques))
{
HeapTupleData tupleData;
HeapTuple tuple;
Expand Down Expand Up @@ -2336,9 +2356,26 @@ PGrnScanOpaqueInit(PGrnScanOpaque so, Relation index)
so->scoreAccessor = NULL;
so->currentID = GRN_ID_NIL;

slist_push_head(&PGrnScanOpaques, &(so->node));
if (PGrnKeepNSearchResults >= 0)
{
while (PGrnNScanOpaques > PGrnKeepNSearchResults)
{
PGrnScanOpaque oldestSo;

oldestSo = dlist_tail_element(PGrnScanOpaqueData,
node,
&PGrnScanOpaques);
if (!oldestSo->isScanEnd)
break;
PGrnScanOpaqueFin(oldestSo);
}
}
dlist_push_head(&PGrnScanOpaques, &(so->node));
PGrnNScanOpaques++;
PGrnScanOpaqueInitPrimaryKeyColumns(so);
so->scoreTargetRecords = NULL;

so->isScanEnd = false;
}

static void
Expand Down Expand Up @@ -2382,19 +2419,8 @@ PGrnScanOpaqueReinit(PGrnScanOpaque so)
static void
PGrnScanOpaqueFin(PGrnScanOpaque so)
{
slist_mutable_iter iter;

slist_foreach_modify(iter, &PGrnScanOpaques)
{
PGrnScanOpaque currentSo;

currentSo = slist_container(PGrnScanOpaqueData, node, iter.cur);
if (currentSo == so)
{
slist_delete_current(&iter);
break;
}
}
dlist_delete(&(so->node));
PGrnNScanOpaques--;

PGrnPrimaryKeyColumnsFin(&(so->primaryKeyColumns));
if (so->scoreTargetRecords)
Expand All @@ -2404,6 +2430,8 @@ PGrnScanOpaqueFin(PGrnScanOpaque so)
}

PGrnScanOpaqueReinit(so);

pfree(so);
}

static IndexScanDesc
Expand Down Expand Up @@ -3709,8 +3737,14 @@ pgroonga_endscan_raw(IndexScanDesc scan)
{
PGrnScanOpaque so = (PGrnScanOpaque) scan->opaque;

PGrnScanOpaqueFin(so);
pfree(so);
if (PGrnKeepNSearchResults < 0)
{
PGrnScanOpaqueFin(so);
}
else
{
so->isScanEnd = true;
}
}

/**
Expand Down

0 comments on commit fc63008

Please sign in to comment.