[Groonga-commit] pgroonga/pgroonga at 32dc217 [master] jsonb: share same value

Back to archive index

Kouhei Sutou null+****@clear*****
Fri Sep 25 00:30:53 JST 2015


Kouhei Sutou	2015-09-25 00:30:53 +0900 (Fri, 25 Sep 2015)

  New Revision: 32dc2174a94a2af2add4df5ee78a88376fd142a8
  https://github.com/pgroonga/pgroonga/commit/32dc2174a94a2af2add4df5ee78a88376fd142a8

  Message:
    jsonb: share same value

  Modified files:
    pgroonga.c

  Modified: pgroonga.c (+52 -4)
===================================================================
--- pgroonga.c    2015-09-24 23:31:55 +0900 (2a0020a)
+++ pgroonga.c    2015-09-25 00:30:53 +0900 (cbc7b61)
@@ -50,6 +50,7 @@ unsigned int grn_vector_pop_element(grn_ctx *ctx, grn_obj *vector,
 									const char **str,
 									unsigned int *weight,
 									grn_id *domain);
+grn_rc grn_obj_cast(grn_ctx *ctx, grn_obj *src, grn_obj *dest, grn_bool addp);
 
 #define VARCHARARRAYOID 1015
 
@@ -1025,9 +1026,10 @@ PGrnCreateDataColumnsForJSON(PGrnCreateData *data)
 		snprintf(jsonValuesTableName, sizeof(jsonValuesTableName),
 				 PGrnJSONValuesTableNameFormat,
 				 data->relNode, data->i);
-		data->jsonValuesTable = PGrnCreateTable(jsonValuesTableName,
-												GRN_OBJ_TABLE_NO_KEY,
-												NULL);
+		data->jsonValuesTable =
+			PGrnCreateTable(jsonValuesTableName,
+							GRN_OBJ_TABLE_HASH_KEY,
+							grn_ctx_at(ctx, GRN_DB_SHORT_TEXT));
 		GRN_PTR_PUT(ctx, data->supplementaryTables, data->jsonValuesTable);
 	}
 
@@ -1967,6 +1969,7 @@ typedef struct PGrnInsertJSONData
 	grn_obj *sizeColumn;
 	grn_obj *typeColumn;
 	grn_obj *valueIDs;
+	grn_obj key;
 	grn_obj components;
 	grn_obj path;
 	grn_obj pathIDs;
@@ -2001,6 +2004,7 @@ PGrnInsertJSONDataInit(PGrnInsertJSONData *data,
 				   grn_obj_id(ctx, data->jsonValuesTable),
 				   GRN_OBJ_VECTOR);
 
+	GRN_TEXT_INIT(&(data->key), 0);
 	GRN_TEXT_INIT(&(data->components), GRN_OBJ_VECTOR);
 	GRN_TEXT_INIT(&(data->path), 0);
 	GRN_RECORD_INIT(&(data->pathIDs), GRN_OBJ_VECTOR,
@@ -2017,6 +2021,7 @@ PGrnInsertJSONDataFin(PGrnInsertJSONData *data)
 	GRN_OBJ_FIN(ctx, &(data->pathIDs));
 	GRN_OBJ_FIN(ctx, &(data->path));
 	GRN_OBJ_FIN(ctx, &(data->components));
+	GRN_OBJ_FIN(ctx, &(data->key));
 
 	grn_obj_unlink(ctx, data->typeColumn);
 	grn_obj_unlink(ctx, data->sizeColumn);
@@ -2029,6 +2034,42 @@ PGrnInsertJSONDataFin(PGrnInsertJSONData *data)
 }
 
 static void
+PGrnInsertJSONGenerateKey(PGrnInsertJSONData *data,
+						  bool haveValue,
+						  const char *typeName)
+{
+	/* TODO: Use hashed value as key to support 4KiB over key. */
+	unsigned int i, n;
+
+	GRN_BULK_REWIND(&(data->key));
+
+	n = grn_vector_size(ctx, &(data->components));
+	for (i = 0; i < n; i++)
+	{
+		const char *component;
+		unsigned int componentSize;
+
+		componentSize = grn_vector_get_element(ctx,
+											   &(data->components),
+											   i,
+											   &component,
+											   NULL,
+											   NULL);
+		GRN_TEXT_PUTS(ctx, &(data->key), ".");
+		GRN_TEXT_PUT(ctx, &(data->key), component, componentSize);
+	}
+
+	GRN_TEXT_PUTS(ctx, &(data->key), "|");
+	GRN_TEXT_PUTS(ctx, &(data->key), typeName);
+
+	if (haveValue)
+	{
+		GRN_TEXT_PUTS(ctx, &(data->key), "|");
+		grn_obj_cast(ctx, &(data->value), &(data->key), GRN_FALSE);
+	}
+}
+
+static void
 PGrnInsertJSONGenerateSubPathsRecursive(PGrnInsertJSONData *data,
 										unsigned int parentStart,
 										unsigned int current)
@@ -2123,9 +2164,16 @@ PGrnInsertJSONValueSet(PGrnInsertJSONData *data,
 					   const char *typeName)
 {
 	grn_id valueID;
+	int added;
 
-	valueID = grn_table_add(ctx, data->jsonValuesTable, NULL, 0, NULL);
+	PGrnInsertJSONGenerateKey(data, column != NULL, typeName);
+	valueID = grn_table_add(ctx, data->jsonValuesTable,
+							GRN_TEXT_VALUE(&(data->key)),
+							GRN_TEXT_LEN(&(data->key)),
+							&added);
 	GRN_RECORD_PUT(ctx, data->valueIDs, valueID);
+	if (!added)
+		return;
 
 	PGrnInsertJSONGeneratePaths(data);
 	grn_obj_set_value(ctx, data->pathsColumn, valueID,
-------------- next part --------------
HTML����������������������������...
Download 



More information about the Groonga-commit mailing list
Back to archive index