Navigation Menu

Skip to content

Commit

Permalink
Stop to use support function
Browse files Browse the repository at this point in the history
Internal API is more portable because support function needs install SQL
change.
  • Loading branch information
kou committed Apr 5, 2015
1 parent c7b936d commit 5edeff7
Show file tree
Hide file tree
Showing 5 changed files with 167 additions and 343 deletions.
2 changes: 1 addition & 1 deletion Makefile
@@ -1,5 +1,5 @@
MODULE_big = pgroonga
SRCS = pgroonga.c pgroonga_types.c
SRCS = pgroonga.c
OBJS = $(SRCS:.c=.o)
EXTENSION = pgroonga
EXTENSION_VERSION = \
Expand Down
174 changes: 152 additions & 22 deletions pgroonga.c
Expand Up @@ -20,11 +20,13 @@
#include <utils/builtins.h>
#include <utils/lsyscache.h>
#include <utils/selfuncs.h>
#include <utils/timestamp.h>
#include <utils/typcache.h>

#include <groonga.h>

#include <stdlib.h>
#include <math.h>

#define VARCHARARRAYOID 1015

Expand Down Expand Up @@ -467,25 +469,123 @@ PGrnGetType(Relation index, AttrNumber n, unsigned char *flags)
}

static void
PGrnGetValue(Relation index, AttrNumber n, grn_obj *buffer, Datum value)
PGrnConvertDatumArrayType(Datum datum, Oid typeID, grn_obj *buffer)
{
FmgrInfo *function;
ArrayType *value = DatumGetArrayTypeP(datum);
int i, n;

n = ARR_DIMS(value)[0];
for (i = 1; i <= n; i++)
{
int weight = 0;
Datum elementDatum;
VarChar *element;
bool isNULL;

elementDatum = array_ref(value, 1, &i, -1, -1, false, 'i', &isNULL);
if (isNULL)
continue;

function = index_getprocinfo(index, n + 1, PGrnGetValueProc);
FunctionCall3(function,
PointerGetDatum(ctx), PointerGetDatum(buffer),
value);
switch (typeID)
{
case VARCHARARRAYOID:
element = DatumGetVarCharPP(elementDatum);
grn_vector_add_element(ctx, buffer,
VARDATA_ANY(element),
VARSIZE_ANY_EXHDR(element),
weight,
buffer->header.domain);
break;
case TEXTARRAYOID:
element = DatumGetTextPP(elementDatum);
grn_vector_add_element(ctx, buffer,
VARDATA_ANY(element),
VARSIZE_ANY_EXHDR(element),
weight,
buffer->header.domain);
break;
}
}
}

static void
PGrnGetQuery(Relation index, AttrNumber n, grn_obj *buffer, Datum value)
PGrnConvertDatum(Datum datum, Oid typeID, grn_obj *buffer)
{
FmgrInfo *function;

function = index_getprocinfo(index, n + 1, PGrnGetQueryProc);
FunctionCall3(function,
PointerGetDatum(ctx), PointerGetDatum(buffer),
value);
switch (typeID)
{
case BOOLOID:
GRN_BOOL_SET(ctx, buffer, DatumGetBool(datum));
break;
case INT2OID:
GRN_INT16_SET(ctx, buffer, DatumGetInt16(datum));
break;
case INT4OID:
GRN_INT32_SET(ctx, buffer, DatumGetInt32(datum));
break;
case INT8OID:
GRN_INT64_SET(ctx, buffer, DatumGetInt64(datum));
break;
case FLOAT4OID:
GRN_FLOAT_SET(ctx, buffer, DatumGetFloat4(datum));
break;
case FLOAT8OID:
GRN_FLOAT_SET(ctx, buffer, DatumGetFloat8(datum));
break;
case TIMESTAMPOID:
case TIMESTAMPTZOID:
{
Timestamp value = DatumGetTimestamp(datum);
pg_time_t unixTime;
int32 usec;

unixTime = timestamptz_to_time_t(value);
#ifdef HAVE_INT64_TIMESTAMP
usec = value % USECS_PER_SEC;
#else
{
double rawUsec;
modf(value, &rawUsec);
usec = rawUsec * USECS_PER_SEC;
if (usec < 0.0)
{
usec = -usec;
}
}
#endif
GRN_TIME_SET(ctx, buffer, GRN_TIME_PACK(unixTime, usec));
break;
}
case TEXTOID:
case XMLOID:
{
text *value = DatumGetTextPP(datum);
GRN_TEXT_SET(ctx, buffer,
VARDATA_ANY(value), VARSIZE_ANY_EXHDR(value));
break;
}
case VARCHAROID:
{
VarChar *value = DatumGetVarCharPP(datum);
GRN_TEXT_SET(ctx, buffer,
VARDATA_ANY(value), VARSIZE_ANY_EXHDR(value));
break;
}
#ifdef NOT_USED
case POINTOID:
/* GRN_DB_TOKYO_GEO_POINT or GRN_DB_WGS84_GEO_POINT; */
break;
#endif
case VARCHARARRAYOID:
case TEXTARRAYOID:
PGrnConvertDatumArrayType(datum, typeID, buffer);
break;
default:
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("pgroonga: unsupported datum type: %u",
typeID)));
break;
}
}

static grn_obj *
Expand Down Expand Up @@ -1127,18 +1227,20 @@ PGrnInsert(grn_ctx *ctx,
for (i = 0; i < desc->natts; i++)
{
grn_obj *dataColumn;
NameData *name = &(desc->attrs[i]->attname);
Form_pg_attribute attribute = desc->attrs[i];
NameData *name;
grn_id domain;
unsigned char flags;

name = &(attribute->attname);
if (isnull[i])
continue;

dataColumn = grn_obj_column(ctx, sourcesTable,
name->data, strlen(name->data));
domain = PGrnGetType(index, i, &flags);
grn_obj_reinit(ctx, &buffer, domain, flags);
PGrnGetValue(index, i, &buffer, values[i]);
PGrnConvertDatum(values[i], attribute->atttypid, &buffer);
grn_obj_set_value(ctx, dataColumn, id, &buffer, GRN_OBJ_SET);
grn_obj_unlink(ctx, dataColumn);
if (!PGrnCheck("pgroonga: failed to set column value")) {
Expand Down Expand Up @@ -1318,6 +1420,7 @@ PGrnSearchBuildConditions(IndexScanDesc scan,
for (i = 0; i < scan->numberOfKeys; i++)
{
ScanKey key = &(scan->keyData[i]);
Form_pg_attribute attribute;
grn_bool isValidStrategy = GRN_TRUE;
const char *targetColumnName;
grn_obj *targetColumn;
Expand All @@ -1328,11 +1431,13 @@ PGrnSearchBuildConditions(IndexScanDesc scan,
if (key->sk_flags & SK_ISNULL)
continue;

attribute = desc->attrs[key->sk_attno - 1];

GRN_EXPR_CREATE_FOR_QUERY(ctx, so->sourcesTable,
matchTarget, matchTargetVariable);
GRN_PTR_PUT(ctx, &(data->matchTargets), matchTarget);

targetColumnName = desc->attrs[key->sk_attno - 1]->attname.data;
targetColumnName = attribute->attname.data;
targetColumn = grn_obj_column(ctx, so->sourcesTable,
targetColumnName,
strlen(targetColumnName));
Expand All @@ -1345,7 +1450,19 @@ PGrnSearchBuildConditions(IndexScanDesc scan,
domain = PGrnGetType(index, key->sk_attno - 1, NULL);
grn_obj_reinit(ctx, &buffer, domain, flags);
}
PGrnGetQuery(index, key->sk_attno - 1, &buffer, key->sk_argument);
{
Oid valueTypeID = attribute->atttypid;
switch (valueTypeID)
{
case VARCHARARRAYOID:
valueTypeID = VARCHAROID;
break;
case TEXTARRAYOID:
valueTypeID = TEXTOID;
break;
}
PGrnConvertDatum(key->sk_argument, valueTypeID, &buffer);
}

switch (key->sk_strategy)
{
Expand Down Expand Up @@ -1575,20 +1692,26 @@ PGrnFillBorder(IndexScanDesc scan,
int *flags)
{
Relation index = scan->indexRelation;
TupleDesc desc;
PGrnScanOpaque so = (PGrnScanOpaque) scan->opaque;
grn_obj *minBorderValue;
grn_obj *maxBorderValue;
int i;

desc = RelationGetDescr(index);

minBorderValue = &(so->minBorderValue);
maxBorderValue = &(so->maxBorderValue);
for (i = 0; i < scan->numberOfKeys; i++)
{
ScanKey key = &(scan->keyData[i]);
AttrNumber attrNumber;
Form_pg_attribute attribute;
grn_id domain;

attrNumber = key->sk_attno - 1;
attribute = desc->attrs[attrNumber];

domain = PGrnGetType(index, attrNumber, NULL);
switch (key->sk_strategy)
{
Expand All @@ -1597,7 +1720,9 @@ PGrnFillBorder(IndexScanDesc scan,
if (maxBorderValue->header.type != GRN_DB_VOID)
{
grn_obj_reinit(ctx, &buffer, domain, 0);
PGrnGetQuery(index, attrNumber, &buffer, key->sk_argument);
PGrnConvertDatum(key->sk_argument,
attribute->atttypid,
&buffer);
if (!PGrnIsMeaningfullMaxBorderValue(maxBorderValue,
&buffer,
*flags,
Expand All @@ -1607,7 +1732,9 @@ PGrnFillBorder(IndexScanDesc scan,
}
}
grn_obj_reinit(ctx, maxBorderValue, domain, 0);
PGrnGetQuery(index, attrNumber, maxBorderValue, key->sk_argument);
PGrnConvertDatum(key->sk_argument,
attribute->atttypid,
maxBorderValue);
*max = GRN_BULK_HEAD(maxBorderValue);
*maxSize = GRN_BULK_VSIZE(maxBorderValue);
*flags &= ~(GRN_CURSOR_LT | GRN_CURSOR_LE);
Expand All @@ -1625,8 +1752,9 @@ PGrnFillBorder(IndexScanDesc scan,
if (minBorderValue->header.type != GRN_DB_VOID)
{
grn_obj_reinit(ctx, &buffer, domain, 0);
PGrnGetQuery(index, attrNumber, &buffer,
key->sk_argument);
PGrnConvertDatum(key->sk_argument,
attribute->atttypid,
&buffer);
if (!PGrnIsMeaningfullMinBorderValue(minBorderValue,
&buffer,
*flags,
Expand All @@ -1636,7 +1764,9 @@ PGrnFillBorder(IndexScanDesc scan,
}
}
grn_obj_reinit(ctx, minBorderValue, domain, 0);
PGrnGetQuery(index, attrNumber, minBorderValue, key->sk_argument);
PGrnConvertDatum(key->sk_argument,
attribute->atttypid,
minBorderValue);
*min = GRN_BULK_HEAD(minBorderValue);
*minSize = GRN_BULK_VSIZE(minBorderValue);
*flags &= ~(GRN_CURSOR_GT | GRN_CURSOR_GE);
Expand Down
19 changes: 0 additions & 19 deletions pgroonga.h
Expand Up @@ -31,10 +31,6 @@
#define PGrnContainStrategyNumber 7 /* operator %% (@ in Groonga) */
#define PGrnQueryStrategyNumber 8 /* operator @@ (Groonga query) */

/* Groonga support functions */
#define PGrnGetValueProc 1
#define PGrnGetQueryProc 2

/* file and table names */
#define PGrnDatabaseBasename "pgrn"
#define PGrnSourcesTableNamePrefix "Sources"
Expand All @@ -44,7 +40,6 @@
#define PGrnLexiconNameFormat "Lexicon%u_%u"
#define PGrnIndexColumnName "index"

/* in pgroonga.c */
extern void PGDLLEXPORT _PG_init(void);

extern Datum PGDLLEXPORT pgroonga_score(PG_FUNCTION_ARGS);
Expand All @@ -70,18 +65,4 @@ extern Datum PGDLLEXPORT pgroonga_vacuumcleanup(PG_FUNCTION_ARGS);
extern Datum PGDLLEXPORT pgroonga_costestimate(PG_FUNCTION_ARGS);
extern Datum PGDLLEXPORT pgroonga_options(PG_FUNCTION_ARGS);

/* in groonga_types.c */
extern Datum PGDLLEXPORT pgroonga_get_text(PG_FUNCTION_ARGS);
extern Datum PGDLLEXPORT pgroonga_get_text_array(PG_FUNCTION_ARGS);
extern Datum PGDLLEXPORT pgroonga_get_varchar(PG_FUNCTION_ARGS);
extern Datum PGDLLEXPORT pgroonga_get_varchar_array(PG_FUNCTION_ARGS);
extern Datum PGDLLEXPORT pgroonga_get_bool(PG_FUNCTION_ARGS);
extern Datum PGDLLEXPORT pgroonga_get_int2(PG_FUNCTION_ARGS);
extern Datum PGDLLEXPORT pgroonga_get_int4(PG_FUNCTION_ARGS);
extern Datum PGDLLEXPORT pgroonga_get_int8(PG_FUNCTION_ARGS);
extern Datum PGDLLEXPORT pgroonga_get_float4(PG_FUNCTION_ARGS);
extern Datum PGDLLEXPORT pgroonga_get_float8(PG_FUNCTION_ARGS);
extern Datum PGDLLEXPORT pgroonga_get_timestamp(PG_FUNCTION_ARGS);
extern Datum PGDLLEXPORT pgroonga_get_timestamptz(PG_FUNCTION_ARGS);

#endif /* PPGROONGA_H */

0 comments on commit 5edeff7

Please sign in to comment.