sandy-bes commented on code in PR #2351:
URL: https://github.com/apache/age/pull/2351#discussion_r2930500905
##########
src/backend/catalog/ag_label.c:
##########
@@ -297,46 +298,104 @@ List *get_all_edge_labels_per_graph(EState *estate, Oid
graph_oid)
HeapTuple tuple;
TupleTableSlot *slot;
ResultRelInfo *resultRelInfo;
+ Oid index_oid;
- /* setup scan keys to get all edges for the given graph oid */
- ScanKeyInit(&scan_keys[1], Anum_ag_label_graph, BTEqualStrategyNumber,
- F_OIDEQ, ObjectIdGetDatum(graph_oid));
- ScanKeyInit(&scan_keys[0], Anum_ag_label_kind, BTEqualStrategyNumber,
- F_CHAREQ, CharGetDatum(LABEL_TYPE_EDGE));
+ index_oid = get_relname_relid("ag_label_graph_oid_index",
+ get_namespace_oid("ag_catalog", false));
/* setup the table to be scanned */
ag_label = table_open(ag_label_relation_id(), RowExclusiveLock);
- scan_desc = table_beginscan(ag_label, estate->es_snapshot, 2, scan_keys);
resultRelInfo = create_entity_result_rel_info(estate, "ag_catalog",
"ag_label");
- slot = ExecInitExtraTupleSlot(
- estate, RelationGetDescr(resultRelInfo->ri_RelationDesc),
- &TTSOpsHeapTuple);
-
- /* scan through the results and get all the label names. */
- while(true)
+ if (OidIsValid(index_oid))
+ {
+ Relation index_rel;
+ IndexScanDesc index_scan_desc;
+
+ slot = ExecInitExtraTupleSlot(
+ estate, RelationGetDescr(resultRelInfo->ri_RelationDesc),
+ &TTSOpsBufferHeapTuple);
+
+ index_rel = index_open(index_oid, RowExclusiveLock);
+
+ ScanKeyInit(&scan_keys[0], Anum_ag_label_name, BTEqualStrategyNumber,
+ F_OIDEQ, ObjectIdGetDatum(graph_oid));
+
+ index_scan_desc = index_beginscan(ag_label, index_rel,
estate->es_snapshot, NULL, 1, 0);
+ index_rescan(index_scan_desc, scan_keys, 1, NULL, 0);
+
+ while (index_getnext_slot(index_scan_desc, ForwardScanDirection, slot))
+ {
+ Name label;
+ Name lval;
+ bool isNull;
+ Datum datum;
+ char kind;
+
+ /*There isn't field kind in index. So we should check it by hands*/
+ datum = slot_getattr(slot, Anum_ag_label_kind, &isNull);
+ if (isNull)
+ continue;
+
+ kind = DatumGetChar(datum);
+
+ if (kind != LABEL_TYPE_EDGE)
+ continue;
+
+ datum = slot_getattr(slot, Anum_ag_label_name, &isNull);
+ if (!isNull)
+ {
+ label = DatumGetName(datum);
+ lval = (Name) palloc(NAMEDATALEN);
+ namestrcpy(lval, NameStr(*label));
+ labels = lappend(labels, lval);
+ }
+ }
+
+ index_endscan(index_scan_desc);
+ index_close(index_rel, RowExclusiveLock);
+ } else
{
- Name label;
- bool isNull;
- Datum datum;
+ slot = ExecInitExtraTupleSlot(
+ estate, RelationGetDescr(resultRelInfo->ri_RelationDesc),
+ &TTSOpsHeapTuple);
- tuple = heap_getnext(scan_desc, ForwardScanDirection);
+ // setup scan keys to get all edges for the given graph oid
+ ScanKeyInit(&scan_keys[1], Anum_ag_label_graph, BTEqualStrategyNumber,
+ F_OIDEQ, ObjectIdGetDatum(graph_oid));
+ ScanKeyInit(&scan_keys[0], Anum_ag_label_kind, BTEqualStrategyNumber,
+ F_CHAREQ, CharGetDatum(LABEL_TYPE_EDGE));
Review Comment:
I've replaced all C++-style // comments.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]