postgresql/src/backend/tsearch/dict.c

132 lines
2.7 KiB
C
Raw Normal View History

/*-------------------------------------------------------------------------
*
* dict.c
* Standard interface to dictionary
*
* Portions Copyright (c) 1996-2007, PostgreSQL Global Development Group
*
*
* IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/tsearch/dict.c,v 1.1 2007/08/21 01:11:18 tgl Exp $
*
*-------------------------------------------------------------------------
*/
#include "postgres.h"
#include "funcapi.h"
#include "access/genam.h"
#include "access/heapam.h"
#include "access/skey.h"
#include "catalog/indexing.h"
#include "catalog/namespace.h"
#include "catalog/pg_ts_dict.h"
#include "catalog/pg_type.h"
#include "tsearch/ts_cache.h"
#include "tsearch/ts_public.h"
#include "tsearch/ts_utils.h"
#include "utils/array.h"
#include "utils/builtins.h"
#include "utils/fmgroids.h"
#include "utils/rel.h"
#include "utils/syscache.h"
/*
* Lexize one word by dictionary, mostly debug function
*/
static ArrayType *
ts_lexize_workhorse(Oid dictId, text *in)
{
TSDictionaryCacheEntry *dict;
TSLexeme *res,
*ptr;
Datum *da;
ArrayType *a;
DictSubState dstate = {false, false, NULL};
dict = lookup_ts_dictionary_cache(dictId);
res = (TSLexeme *) DatumGetPointer(FunctionCall4(&dict->lexize,
PointerGetDatum(dict->dictData),
PointerGetDatum(VARDATA(in)),
Int32GetDatum(VARSIZE(in) - VARHDRSZ),
PointerGetDatum(&dstate)));
if (dstate.getnext)
{
dstate.isend = true;
ptr = (TSLexeme *) DatumGetPointer(FunctionCall4(&dict->lexize,
PointerGetDatum(dict->dictData),
PointerGetDatum(VARDATA(in)),
Int32GetDatum(VARSIZE(in) - VARHDRSZ),
PointerGetDatum(&dstate)));
if (ptr != NULL)
res = ptr;
}
if (!res)
return NULL;
ptr = res;
while (ptr->lexeme)
ptr++;
da = (Datum *) palloc(sizeof(Datum) * (ptr - res + 1));
ptr = res;
while (ptr->lexeme)
{
da[ptr - res] = DirectFunctionCall1(textin, CStringGetDatum(ptr->lexeme));
ptr++;
}
a = construct_array(da,
ptr - res,
TEXTOID,
-1,
false,
'i');
ptr = res;
while (ptr->lexeme)
{
pfree(DatumGetPointer(da[ptr - res]));
pfree(ptr->lexeme);
ptr++;
}
pfree(res);
pfree(da);
return a;
}
Datum
ts_lexize_byid(PG_FUNCTION_ARGS)
{
Oid dictId = PG_GETARG_OID(0);
text *in = PG_GETARG_TEXT_P(1);
ArrayType *a;
a = ts_lexize_workhorse(dictId, in);
if (a)
PG_RETURN_POINTER(a);
else
PG_RETURN_NULL();
}
Datum
ts_lexize_byname(PG_FUNCTION_ARGS)
{
text *dictname = PG_GETARG_TEXT_P(0);
text *in = PG_GETARG_TEXT_P(1);
Oid dictId;
ArrayType *a;
dictId = TSDictionaryGetDictid(textToQualifiedNameList(dictname), false);
a = ts_lexize_workhorse(dictId, in);
if (a)
PG_RETURN_POINTER(a);
else
PG_RETURN_NULL();
}