Kouhei Sutou
null+****@clear*****
Sun Jan 24 22:31:41 JST 2016
Kouhei Sutou 2016-01-24 22:31:41 +0900 (Sun, 24 Jan 2016) New Revision: 45ae03e60d5f1371ba123669eef4d95e7468602e https://github.com/pgroonga/pgroonga/commit/45ae03e60d5f1371ba123669eef4d95e7468602e Message: jsonb: create temporary tables for sequential search Sequential search against jsonb isn't implemented yet. Modified files: src/pgrn_create.h src/pgrn_jsonb.c src/pgrn_jsonb.h src/pgroonga.c Modified: src/pgrn_create.h (+0 -2) =================================================================== --- src/pgrn_create.h 2016-01-24 22:22:00 +0900 (e6ecfb9) +++ src/pgrn_create.h 2016-01-24 22:31:41 +0900 (79e6e07) @@ -10,8 +10,6 @@ typedef struct PGrnCreateData Relation index; grn_obj *sourcesTable; grn_obj *sourcesCtidColumn; - grn_obj *jsonPathsTable; - grn_obj *jsonValuesTable; grn_obj *supplementaryTables; grn_obj *lexicons; unsigned int i; Modified: src/pgrn_jsonb.c (+148 -83) =================================================================== --- src/pgrn_jsonb.c 2016-01-24 22:22:00 +0900 (e9810bc) +++ src/pgrn_jsonb.c 2016-01-24 22:31:41 +0900 (751683f) @@ -22,6 +22,12 @@ PG_FUNCTION_INFO_V1(pgroonga_match_jsonb); #endif #ifdef JSONBOID +typedef struct +{ + grn_obj *pathsTable; + grn_obj *typesTable; + grn_obj *valuesTable; +} PGrnJSONBCreateData; static grn_ctx *ctx = &PGrnContext; static struct PGrnBuffers *buffers = &PGrnBuffers; @@ -30,6 +36,97 @@ static const unsigned int PGRN_JSON_GENERATE_PATH_IS_ABSOLUTE = 1 << 0; static const unsigned int PGRN_JSON_GENERATE_PATH_INCLUDE_ARRAY = 1 << 1; static const unsigned int PGRN_JSON_GENERATE_PATH_USE_DOT_STYLE = 1 << 2; +static grn_obj *tmpPathsTable = NULL; +static grn_obj *tmpTypesTable = NULL; +static grn_obj *tmpValuesTable = NULL; + +static grn_obj * +PGrnJSONBCreatePathsTable(const char *name) +{ + return PGrnCreateTable(name, + GRN_OBJ_TABLE_PAT_KEY, + grn_ctx_at(ctx, GRN_DB_SHORT_TEXT)); +} + +static grn_obj * +PGrnJSONBCreateTypesTable(const char *name) +{ + return PGrnCreateTable(name, + GRN_OBJ_TABLE_PAT_KEY, + grn_ctx_at(ctx, GRN_DB_SHORT_TEXT)); +} + +static grn_obj * +PGrnJSONBCreateValuesTable(const char *name) +{ + return PGrnCreateTable(name, + GRN_OBJ_TABLE_HASH_KEY, + grn_ctx_at(ctx, GRN_DB_UINT64)); +} + +static void +PGrnJSONBCreateDataColumns(PGrnJSONBCreateData *jsonbData) +{ + PGrnCreateColumn(jsonbData->valuesTable, + "path", + GRN_OBJ_COLUMN_SCALAR, + jsonbData->pathsTable); + PGrnCreateColumn(jsonbData->valuesTable, + "paths", + GRN_OBJ_COLUMN_VECTOR, + jsonbData->pathsTable); + { + grn_obj_flags flags = 0; + if (PGrnIsLZ4Available) + flags |= GRN_OBJ_COMPRESS_LZ4; + PGrnCreateColumn(jsonbData->valuesTable, + "string", + flags, + grn_ctx_at(ctx, GRN_DB_LONG_TEXT)); + } + PGrnCreateColumn(jsonbData->valuesTable, + "number", + 0, + grn_ctx_at(ctx, GRN_DB_FLOAT)); + PGrnCreateColumn(jsonbData->valuesTable, + "size", + 0, + grn_ctx_at(ctx, GRN_DB_UINT32)); + PGrnCreateColumn(jsonbData->valuesTable, + "type", + 0, + jsonbData->typesTable); +} +#endif + +void +PGrnInitializeJSONB(void) +{ +#ifdef JSONBOID + PGrnJSONBCreateData data; + + tmpPathsTable = PGrnJSONBCreatePathsTable(NULL); + tmpTypesTable = PGrnJSONBCreateTypesTable(NULL); + tmpValuesTable = PGrnJSONBCreateValuesTable(NULL); + + data.pathsTable = tmpPathsTable; + data.typesTable = tmpTypesTable; + data.valuesTable = tmpValuesTable; + PGrnJSONBCreateDataColumns(&data); +#endif +} + +void +PGrnFinalizeJSONB(void) +{ +#ifdef JSONBOID + grn_obj_remove(ctx, tmpValuesTable); + grn_obj_remove(ctx, tmpTypesTable); + grn_obj_remove(ctx, tmpPathsTable); +#endif +} + +#ifdef JSONBOID static void PGrnJSONGeneratePath(grn_obj *components, unsigned int start, @@ -136,20 +233,16 @@ PGrnLookupJSONValuesTable(Relation index, } static void -PGrnCreateDataColumnsForJSON(PGrnCreateData *data) +PGrnJSONBCreateTables(PGrnCreateData *data, + PGrnJSONBCreateData *jsonbData) { - grn_obj *jsonTypesTable; - { char jsonPathsTableName[GRN_TABLE_MAX_KEY_SIZE]; snprintf(jsonPathsTableName, sizeof(jsonPathsTableName), PGrnJSONPathsTableNameFormat, data->relNode, data->i); - data->jsonPathsTable = - PGrnCreateTable(jsonPathsTableName, - GRN_OBJ_TABLE_PAT_KEY, - grn_ctx_at(ctx, GRN_DB_SHORT_TEXT)); - GRN_PTR_PUT(ctx, data->supplementaryTables, data->jsonPathsTable); + jsonbData->pathsTable = PGrnJSONBCreatePathsTable(jsonPathsTableName); + GRN_PTR_PUT(ctx, data->supplementaryTables, jsonbData->pathsTable); } { @@ -157,60 +250,23 @@ PGrnCreateDataColumnsForJSON(PGrnCreateData *data) snprintf(jsonTypesTableName, sizeof(jsonTypesTableName), PGrnJSONTypesTableNameFormat, data->relNode, data->i); - jsonTypesTable = PGrnCreateTable(jsonTypesTableName, - GRN_OBJ_TABLE_PAT_KEY, - grn_ctx_at(ctx, GRN_DB_SHORT_TEXT)); - GRN_PTR_PUT(ctx, data->supplementaryTables, jsonTypesTable); + jsonbData->typesTable = PGrnJSONBCreateTypesTable(jsonTypesTableName); + GRN_PTR_PUT(ctx, data->supplementaryTables, jsonbData->typesTable); } + { char jsonValuesTableName[GRN_TABLE_MAX_KEY_SIZE]; snprintf(jsonValuesTableName, sizeof(jsonValuesTableName), PGrnJSONValuesTableNameFormat, data->relNode, data->i); - data->jsonValuesTable = - PGrnCreateTable(jsonValuesTableName, - GRN_OBJ_TABLE_HASH_KEY, - grn_ctx_at(ctx, GRN_DB_UINT64)); - GRN_PTR_PUT(ctx, data->supplementaryTables, data->jsonValuesTable); + jsonbData->valuesTable = PGrnJSONBCreateValuesTable(jsonValuesTableName); + GRN_PTR_PUT(ctx, data->supplementaryTables, jsonbData->valuesTable); } - - PGrnCreateColumn(data->jsonValuesTable, - "path", - GRN_OBJ_COLUMN_SCALAR, - data->jsonPathsTable); - PGrnCreateColumn(data->jsonValuesTable, - "paths", - GRN_OBJ_COLUMN_VECTOR, - data->jsonPathsTable); - { - grn_obj_flags flags = 0; - if (PGrnIsLZ4Available) - flags |= GRN_OBJ_COMPRESS_LZ4; - PGrnCreateColumn(data->jsonValuesTable, - "string", - flags, - grn_ctx_at(ctx, GRN_DB_LONG_TEXT)); - } - PGrnCreateColumn(data->jsonValuesTable, - "number", - 0, - grn_ctx_at(ctx, GRN_DB_FLOAT)); - PGrnCreateColumn(data->jsonValuesTable, - "boolean", - 0, - grn_ctx_at(ctx, GRN_DB_BOOL)); - PGrnCreateColumn(data->jsonValuesTable, - "size", - 0, - grn_ctx_at(ctx, GRN_DB_UINT32)); - PGrnCreateColumn(data->jsonValuesTable, - "type", - 0, - jsonTypesTable); } static void -PGrnCreateFullTextSearchIndexColumnForJSON(PGrnCreateData *data) +PGrnJSONBCreateFullTextSearchIndexColumn(PGrnCreateData *data, + PGrnJSONBCreateData *jsonbData) { const char *tokenizerName = PGRN_DEFAULT_TOKENIZER; const char *normalizerName = PGRN_DEFAULT_NORMALIZER; @@ -241,14 +297,15 @@ PGrnCreateFullTextSearchIndexColumnForJSON(PGrnCreateData *data) PGrnCreateColumn(lexicon, PGrnIndexColumnName, GRN_OBJ_COLUMN_INDEX | GRN_OBJ_WITH_POSITION, - data->jsonValuesTable); + jsonbData->valuesTable); } static void -PGrnCreateIndexColumnForJSON(PGrnCreateData *data, - const char *typeName, - grn_obj_flags tableType, - grn_obj *type) +PGrnJSONBCreateIndexColumn(PGrnCreateData *data, + PGrnJSONBCreateData *jsonbData, + const char *typeName, + grn_obj_flags tableType, + grn_obj *type) { char lexiconName[GRN_TABLE_MAX_KEY_SIZE]; grn_obj *lexicon; @@ -261,40 +318,45 @@ PGrnCreateIndexColumnForJSON(PGrnCreateData *data, PGrnCreateColumn(lexicon, PGrnIndexColumnName, GRN_OBJ_COLUMN_INDEX, - data->jsonValuesTable); + jsonbData->valuesTable); } static void -PGrnCreateIndexColumnsForJSON(PGrnCreateData *data) +PGrnJSONBCreateIndexColumns(PGrnCreateData *data, + PGrnJSONBCreateData *jsonbData) { - PGrnCreateColumn(data->jsonValuesTable, + PGrnCreateColumn(jsonbData->valuesTable, PGrnIndexColumnName, GRN_OBJ_COLUMN_INDEX, data->sourcesTable); - PGrnCreateColumn(data->jsonPathsTable, + PGrnCreateColumn(jsonbData->pathsTable, PGrnIndexColumnName, GRN_OBJ_COLUMN_INDEX | GRN_OBJ_WITH_SECTION, - data->jsonValuesTable); + jsonbData->valuesTable); /* TODO: 4KiB over string value can't be searched. */ - PGrnCreateIndexColumnForJSON(data, - "String", - GRN_OBJ_TABLE_PAT_KEY, - grn_ctx_at(ctx, GRN_DB_SHORT_TEXT)); - PGrnCreateIndexColumnForJSON(data, - "Number", - GRN_OBJ_TABLE_PAT_KEY, - grn_ctx_at(ctx, GRN_DB_FLOAT)); - PGrnCreateIndexColumnForJSON(data, - "Boolean", - GRN_OBJ_TABLE_HASH_KEY, - grn_ctx_at(ctx, GRN_DB_BOOL)); - PGrnCreateIndexColumnForJSON(data, - "Size", - GRN_OBJ_TABLE_PAT_KEY, - grn_ctx_at(ctx, GRN_DB_UINT32)); - - PGrnCreateFullTextSearchIndexColumnForJSON(data); + PGrnJSONBCreateIndexColumn(data, + jsonbData, + "String", + GRN_OBJ_TABLE_PAT_KEY, + grn_ctx_at(ctx, GRN_DB_SHORT_TEXT)); + PGrnJSONBCreateIndexColumn(data, + jsonbData, + "Number", + GRN_OBJ_TABLE_PAT_KEY, + grn_ctx_at(ctx, GRN_DB_FLOAT)); + PGrnJSONBCreateIndexColumn(data, + jsonbData, + "Boolean", + GRN_OBJ_TABLE_HASH_KEY, + grn_ctx_at(ctx, GRN_DB_BOOL)); + PGrnJSONBCreateIndexColumn(data, + jsonbData, + "Size", + GRN_OBJ_TABLE_PAT_KEY, + grn_ctx_at(ctx, GRN_DB_UINT32)); + + PGrnJSONBCreateFullTextSearchIndexColumn(data, jsonbData); } #endif @@ -312,6 +374,8 @@ void PGrnJSONBCreate(PGrnCreateData *data) { #ifdef JSONBOID + PGrnJSONBCreateData jsonbData; + if (data->desc->natts != 1) { ereport(ERROR, @@ -321,11 +385,12 @@ PGrnJSONBCreate(PGrnCreateData *data) data->index->rd_rel->relname.data))); } - PGrnCreateDataColumnsForJSON(data); - PGrnCreateIndexColumnsForJSON(data); + PGrnJSONBCreateTables(data, &jsonbData); + PGrnJSONBCreateDataColumns(&jsonbData); + PGrnJSONBCreateIndexColumns(data, &jsonbData); data->forFullTextSearch = false; data->forRegexpSearch = false; - data->attributeTypeID = grn_obj_id(ctx, data->jsonValuesTable); + data->attributeTypeID = grn_obj_id(ctx, jsonbData.valuesTable); data->attributeFlags = GRN_OBJ_VECTOR; PGrnCreateDataColumn(data); #endif Modified: src/pgrn_jsonb.h (+5 -1) =================================================================== --- src/pgrn_jsonb.h 2016-01-24 22:22:00 +0900 (91e19ed) +++ src/pgrn_jsonb.h 2016-01-24 22:31:41 +0900 (343f07d) @@ -6,6 +6,9 @@ #include "pgrn_create.h" #include "pgrn_search.h" +void PGrnInitializeJSONB(void); +void PGrnFinalizeJSONB(void); + bool PGrnAttributeIsJSONB(Oid id); void PGrnJSONBCreate(PGrnCreateData *data); @@ -21,7 +24,8 @@ bool PGrnJSONBBuildSearchCondition(PGrnSearchData *data, ScanKey key, grn_obj *targetColumn); -typedef struct { +typedef struct +{ bool isJSONBAttribute; Relation index; grn_obj *sourcesTable; Modified: src/pgroonga.c (+11 -9) =================================================================== --- src/pgroonga.c 2016-01-24 22:22:00 +0900 (e2b3b9c) +++ src/pgroonga.c 2016-01-24 22:31:41 +0900 (90182cf) @@ -226,6 +226,8 @@ PGrnOnProcExit(int code, Datum arg) { grn_obj *db; + PGrnFinalizeJSONB(); + PGrnFinalizeSequentialSearchData(); PGrnFinalizeBuffers(); @@ -297,6 +299,8 @@ _PG_init(void) PGrnInitializeOptions(); PGrnInitializeSequentialSearchData(); + + PGrnInitializeJSONB(); } static grn_id @@ -570,8 +574,6 @@ PGrnCreate(Relation index, data.index = index; data.desc = RelationGetDescr(index); data.relNode = index->rd_node.relNode; - data.jsonPathsTable = NULL; - data.jsonValuesTable = NULL; data.supplementaryTables = supplementaryTables; data.lexicons = lexicons; @@ -2833,13 +2835,13 @@ pgroonga_bulkdelete(PG_FUNCTION_ARGS) { grn_id id; grn_obj *sourcesCtidColumn; - PGrnJSONBBulkDeleteData JSONBData; + PGrnJSONBBulkDeleteData jsonbData; sourcesCtidColumn = PGrnLookupSourcesCtidColumn(index, ERROR); - JSONBData.index = index; - JSONBData.sourcesTable = sourcesTable; - PGrnJSONBBulkDeleteInit(&JSONBData); + jsonbData.index = index; + jsonbData.sourcesTable = sourcesTable; + PGrnJSONBBulkDeleteInit(&jsonbData); while ((id = grn_table_cursor_next(ctx, cursor)) != GRN_ID_NIL) { @@ -2852,8 +2854,8 @@ pgroonga_bulkdelete(PG_FUNCTION_ARGS) ctid = UInt64ToCtid(GRN_UINT64_VALUE(&(buffers->ctid))); if (callback(&ctid, callback_state)) { - JSONBData.id = id; - PGrnJSONBBulkDeleteRecord(&JSONBData); + jsonbData.id = id; + PGrnJSONBBulkDeleteRecord(&jsonbData); grn_table_cursor_delete(ctx, cursor); @@ -2861,7 +2863,7 @@ pgroonga_bulkdelete(PG_FUNCTION_ARGS) } } - PGrnJSONBBulkDeleteFin(&JSONBData); + PGrnJSONBBulkDeleteFin(&jsonbData); grn_table_cursor_close(ctx, cursor); } -------------- next part -------------- HTML����������������������������...Download