Kouhei Sutou
null+****@clear*****
Wed Feb 11 17:08:28 JST 2015
Kouhei Sutou 2015-02-11 17:08:28 +0900 (Wed, 11 Feb 2015) New Revision: d667d3c969d92d3f94c89b10f5faf10bcd1f12c2 https://github.com/pgroonga/pgroonga/commit/d667d3c969d92d3f94c89b10f5faf10bcd1f12c2 Message: Use column name instead of index name for match target Modified files: pgroonga.c Modified: pgroonga.c (+25 -3) =================================================================== --- pgroonga.c 2015-02-11 16:32:35 +0900 (ba65b92) +++ pgroonga.c 2015-02-11 17:08:28 +0900 (49f6fed) @@ -62,6 +62,7 @@ typedef PGrnScanOpaqueData *PGrnScanOpaque; typedef struct PGrnSearchData { grn_obj *indexColumn; + grn_obj targetColumns; grn_obj matchTargets; grn_obj sectionID; grn_obj *expression; @@ -850,12 +851,16 @@ PGrnSearchBuildConditions(IndexScanDesc scan, PGrnSearchData *data) { Relation index = scan->indexRelation; + TupleDesc desc; int i, nExpressions = 0; + desc = RelationGetDescr(index); for (i = 0; i < scan->numberOfKeys; i++) { ScanKey key = &(scan->keyData[i]); grn_bool isValidStrategy = GRN_TRUE; + const char *targetColumnName; + grn_obj *targetColumn; grn_obj *matchTarget, *matchTargetVariable; grn_operator operator = GRN_OP_NOP; @@ -867,8 +872,12 @@ PGrnSearchBuildConditions(IndexScanDesc scan, matchTarget, matchTargetVariable); GRN_PTR_PUT(ctx, &(data->matchTargets), matchTarget); - grn_expr_append_obj(ctx, matchTarget, - data->indexColumn, GRN_OP_PUSH, 1); + targetColumnName = desc->attrs[key->sk_attno - 1]->attname.data; + targetColumn = grn_obj_column(ctx, so->idsTable, + targetColumnName, + strlen(targetColumnName)); + GRN_PTR_PUT(ctx, &(data->targetColumns), targetColumn); + grn_expr_append_obj(ctx, matchTarget, targetColumn, GRN_OP_PUSH, 1); GRN_UINT32_SET(ctx, &(data->sectionID), key->sk_attno - 1); grn_expr_append_const(ctx, matchTarget, @@ -958,9 +967,12 @@ PGrnSearchBuildConditions(IndexScanDesc scan, static void PGrnSearchDataFree(PGrnSearchData *data) { - unsigned int i, nMatchTargets; + unsigned int i; + unsigned int nMatchTargets; + unsigned int nTargetColumns; grn_obj_unlink(ctx, data->expression); + nMatchTargets = GRN_BULK_VSIZE(&(data->matchTargets)) / sizeof(grn_obj *); for (i = 0; i < nMatchTargets; i++) { @@ -968,6 +980,15 @@ PGrnSearchDataFree(PGrnSearchData *data) grn_obj_unlink(ctx, matchTarget); } GRN_OBJ_FIN(ctx, &(data->matchTargets)); + + nTargetColumns = GRN_BULK_VSIZE(&(data->targetColumns)) / sizeof(grn_obj *); + for (i = 0; i < nTargetColumns; i++) + { + grn_obj *targetColumn = GRN_PTR_VALUE_AT(&(data->targetColumns), i); + grn_obj_unlink(ctx, targetColumn); + } + GRN_OBJ_FIN(ctx, &(data->targetColumns)); + GRN_OBJ_FIN(ctx, &(data->sectionID)); } @@ -982,6 +1003,7 @@ PGrnSearch(IndexScanDesc scan) return; GRN_PTR_INIT(&(data.matchTargets), GRN_OBJ_VECTOR, GRN_ID_NIL); + GRN_PTR_INIT(&(data.targetColumns), GRN_OBJ_VECTOR, GRN_ID_NIL); GRN_UINT32_INIT(&(data.sectionID), 0); data.indexColumn = PGrnLookupIndexColumn(index, ERROR); -------------- next part -------------- HTML����������������������������... 다운로드