Skip to content

Commit 66aeee2

Browse files
committed
Add Hash Indices to label tables
1 parent a72fce3 commit 66aeee2

File tree

7 files changed

+172
-35
lines changed

7 files changed

+172
-35
lines changed

Makefile

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ PG_LIBS += -ltree
8181
all: postgraph--0.1.0.sql
8282

8383
ag_regress_dir = $(srcdir)/regress
84-
REGRESS_OPTS = --load-extension=postgis --load-extension=ltree --load-extension=postgraph --inputdir=$(ag_regress_dir) --outputdir=$(ag_regress_dir) --temp-instance=$(ag_regress_dir)/instance --port=61958 --encoding=UTF-8
84+
REGRESS_OPTS = --load-extension=bloom --load-extension=postgis --load-extension=ltree --load-extension=postgraph --inputdir=$(ag_regress_dir) --outputdir=$(ag_regress_dir) --temp-instance=$(ag_regress_dir)/instance --port=61958 --encoding=UTF-8
8585

8686
ag_regress_out = instance/ log/ results/ regression.*
8787
EXTRA_CLEAN = $(addprefix $(ag_regress_dir)/, $(ag_regress_out)) src/backend/parser/cypher_gram.c src/backend/parser/ag_scanner.c src/include/parser/cypher_gram_def.h src/include/parser/cypher_kwlist_d.h
@@ -90,9 +90,9 @@ GEN_KEYWORDLIST = $(PERL) -I ./tools/ ./tools/gen_keywordlist.pl
9090
GEN_KEYWORDLIST_DEPS = ./tools/gen_keywordlist.pl tools/PerfectHash.pm
9191

9292
ag_include_dir = $(srcdir)/src/include
93-
PG_CPPFLAGS = -w -I$(ag_include_dir) -I$(ag_include_dir)/parser -I$(POSTGIS_DIR) -I$(POSTGIS_DIR)/liblwgeom -I/home/josh/postgres/contrib/ltree
93+
PG_CPPFLAGS = -w -I$(ag_include_dir) -I$(ag_include_dir)/parser -I$(POSTGIS_DIR) -I$(POSTGIS_DIR)/liblwgeom -I/home/josh/postgres/contrib/ltree -I/home/josh/postgres/contrib/bloom
9494
PG_LDFLAGS = -lgeos_c
95-
SHLIB_LINK= $(POSTGIS_DIR)/liblwgeom/.libs/liblwgeom.a -Wl,--no-as-needed -Wl,-l:postgis-3.so -Wl,-l:ltree.so
95+
SHLIB_LINK= $(POSTGIS_DIR)/liblwgeom/.libs/liblwgeom.a -Wl,--no-as-needed -Wl,-l:postgis-3.so -Wl,-l:ltree.so -Wl,-l:bloom.so
9696

9797
PG_CONFIG ?= pg_config
9898
PGXS := $(shell $(PG_CONFIG) --pgxs)

postgraph--0.1.0.sql

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -751,6 +751,15 @@ USING hash
751751
AS
752752
OPERATOR 1 =,
753753
FUNCTION 1 graphid_hash_cmp(graphid);
754+
755+
756+
CREATE OPERATOR CLASS graphid_ops_bloom
757+
DEFAULT FOR TYPE graphid
758+
USING bloom
759+
AS
760+
OPERATOR 1 =,
761+
FUNCTION 1 graphid_hash_cmp(graphid);
762+
754763
--
755764
-- btree operator classes for graphid
756765
--

src/backend/access/vertex_heap/vertex_heapam_handler.c

Lines changed: 62 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ static char *make_vertex_adjlist_alias(char *var_name) {
105105

106106
return str;
107107
}
108+
#include "bloom.h"
108109

109110
TableScanDesc vertex_scan_begin(Relation relation, Snapshot snapshot, int nkeys,
110111
struct ScanKeyData *key,
@@ -123,17 +124,40 @@ TableScanDesc vertex_scan_begin(Relation relation, Snapshot snapshot, int nkeys,
123124
Oid oid = get_relname_relid(make_vertex_adjlist_alias(get_rel_name(RelationGetRelid(relation))), get_rel_namespace(RelationGetRelid(relation)));
124125
Relation rel = RelationIdGetRelation(oid);
125126

126-
TableScanDesc *desc = tableam->scan_begin(rel, snapshot, nkeys, key, parallel_scan, flags);
127-
vertex_desc->desc = palloc(sizeof (TableScanDesc *) * vertex_desc->ndesc);
128-
vertex_desc->desc[0] = desc;
127+
vertex_desc->desc = palloc(sizeof (TableScanDesc *) * vertex_desc->ndesc);
128+
vertex_desc->isIndex = palloc(sizeof (bool) * vertex_desc->ndesc);
129+
130+
List *indexoidlist = RelationGetIndexList(relation);
131+
if(list_length(indexoidlist) == 1) {
132+
Oid idx = linitial_oid(indexoidlist);
133+
134+
IndexScanDesc *desc = index_beginscan(rel,
135+
RelationIdGetRelation(idx),
136+
snapshot,
137+
nkeys, 0);
138+
139+
index_rescan(desc, key, nkeys, NULL, 0);
140+
141+
vertex_desc->desc[0] = desc;
142+
vertex_desc->isIndex[0] = true;
143+
} else {
144+
145+
TableScanDesc *desc = tableam->scan_begin(rel, snapshot, nkeys, key, parallel_scan, flags);
146+
147+
vertex_desc->desc[0] = desc;
148+
vertex_desc->isIndex[0] = false;
149+
}
129150
return vertex_desc;
130151
}
131152

132153
void vertex_scan_end(TableScanDesc sscan) {
133154
VertexScanDescData *vertex_desc = sscan;
134155
RelationDecrementReferenceCount( ((HeapScanDesc)vertex_desc->desc[0])->rs_base.rs_rd);
135156

136-
GetHeapamTableAmRoutine()->scan_end(vertex_desc->desc[0]);
157+
if (vertex_desc->isIndex[0])
158+
index_endscan(vertex_desc->desc[0]);
159+
else
160+
GetHeapamTableAmRoutine()->scan_end(vertex_desc->desc[0]);
137161
}
138162

139163
/*
@@ -156,8 +180,12 @@ bool vertex_scan_getnextslot(TableScanDesc sscan, ScanDirection direction,
156180
VertexScanDescData *vertex_desc = sscan;
157181

158182
TableAmRoutine *tableam = GetHeapamTableAmRoutine();
159-
160-
return tableam->scan_getnextslot(vertex_desc->desc[0], direction, slot);
183+
if (vertex_desc->desc[0])
184+
return false;
185+
if (vertex_desc->isIndex[0])
186+
return index_getnext_slot(vertex_desc->desc[0], direction, slot);
187+
else
188+
return tableam->scan_getnextslot(vertex_desc->desc[0], direction, slot);
161189
}
162190

163191
/* ------------------------------------------------------------------------
@@ -214,7 +242,7 @@ void vertex_parallelscan_reinitialize(Relation rel, ParallelTableScanDesc pscan)
214242
*/
215243
struct IndexFetchTableData *vertex_index_fetch_begin(Relation rel) {
216244
ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
217-
errmsg_internal("vertex_parallelscan_reinitialize not implemented")));
245+
errmsg_internal("vertex_index_fetch_begin not implemented")));
218246

219247
return NULL;
220248
}
@@ -225,15 +253,15 @@ struct IndexFetchTableData *vertex_index_fetch_begin(Relation rel) {
225253
*/
226254
void vertex_index_fetch_reset(struct IndexFetchTableData *data) {
227255
ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
228-
errmsg_internal("vertex_parallelscan_reinitialize not implemented")));
256+
errmsg_internal("vertex_index_fetch_reset not implemented")));
229257
}
230258

231259
/*
232260
* Release resources and deallocate index fetch.
233261
*/
234262
void vertex_index_fetch_end(struct IndexFetchTableData *data) {
235263
ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
236-
errmsg_internal("vertex_parallelscan_reinitialize not implemented")));
264+
errmsg_internal("vertex_index_fetch_end not implemented")));
237265
}
238266

239267
/*
@@ -261,7 +289,7 @@ bool vertex_index_fetch_tuple(struct IndexFetchTableData *scan,
261289
TupleTableSlot *slot,
262290
bool *call_again, bool *all_dead) {
263291
ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
264-
errmsg_internal("vertex_parallelscan_reinitialize not implemented")));
292+
errmsg_internal("vertex_index_fetch_tuple not implemented")));
265293
return false;
266294
}
267295

@@ -301,7 +329,7 @@ bool vertex_tuple_fetch_row_version(Relation relation, ItemPointer tid,
301329
*/
302330
bool vertex_tuple_tid_valid(TableScanDesc scan, ItemPointer tid) {
303331
ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
304-
errmsg_internal("vertex_parallelscan_reinitialize not implemented")));
332+
errmsg_internal("vertex_tuple_tid_valid not implemented")));
305333

306334

307335
return false;
@@ -313,7 +341,7 @@ bool vertex_tuple_tid_valid(TableScanDesc scan, ItemPointer tid) {
313341
*/
314342
void vertex_tuple_get_latest_tid(TableScanDesc scan, ItemPointer tid) {
315343
ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
316-
errmsg_internal("vertex_parallelscan_reinitialize not implemented")));
344+
errmsg_internal("vertex_tuple_get_latest_tid not implemented")));
317345

318346

319347
}
@@ -325,15 +353,15 @@ void vertex_tuple_get_latest_tid(TableScanDesc scan, ItemPointer tid) {
325353
bool vertex_tuple_satisfies_snapshot(Relation rel, TupleTableSlot *slot,
326354
Snapshot snapshot) {
327355
ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
328-
errmsg_internal("vertex_parallelscan_reinitialize not implemented")));
356+
errmsg_internal("vertex_tuple_satisfies_snapshot not implemented")));
329357

330358
return false;
331359
}
332360

333361
/* see table_index_delete_tuples() */
334362
TransactionId vertex_index_delete_tuples(Relation rel, TM_IndexDeleteOp *delstate) {
335363
ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
336-
errmsg_internal("vertex_parallelscan_reinitialize not implemented")));
364+
errmsg_internal("vertex_index_delete_tuples not implemented")));
337365

338366

339367
return InvalidTransactionId;
@@ -370,14 +398,14 @@ void vertex_tuple_insert_speculative(Relation rel, TupleTableSlot *slot,
370398
void vertex_tuple_complete_speculative(Relation rel, TupleTableSlot *slot,
371399
uint32 specToken, bool succeeded) {
372400
ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
373-
errmsg_internal("vertex_parallelscan_reinitialize not implemented")));
401+
errmsg_internal("vertex_tuple_complete_speculative not implemented")));
374402
}
375403

376404
/* see table_multi_insert() for reference about parameters */
377405
void vertex_multi_insert(Relation rel, TupleTableSlot **slots, int nslots,
378406
CommandId cid, int options, struct BulkInsertStateData *bistate) {
379407
ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
380-
errmsg_internal("vertex_parallelscan_reinitialize not implemented")));
408+
errmsg_internal("vertex_multi_insert not implemented")));
381409
}
382410

383411
/* see table_tuple_delete() for reference about parameters */
@@ -401,7 +429,7 @@ TM_Result vertex_tuple_lock(Relation rel, ItemPointer tid, Snapshot snapshot,
401429
TupleTableSlot *slot, CommandId cid, LockTupleMode mode,
402430
LockWaitPolicy wait_policy, uint8 flags, TM_FailureData *tmfd) {
403431
ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
404-
errmsg_internal("vertex_parallelscan_reinitialize not implemented")));
432+
errmsg_internal("vertex_tuple_lock not implemented")));
405433
return 0;
406434
}
407435

@@ -456,7 +484,7 @@ void vertex_relation_nontransactional_truncate(Relation rel) {
456484
*/
457485
void vertex_relation_copy_data(Relation rel, const RelFileNode *newrnode) {
458486
ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
459-
errmsg_internal("vertex_parallelscan_reinitialize not implemented")));
487+
errmsg_internal("vertex_relation_copy_data not implemented")));
460488

461489

462490

@@ -469,7 +497,7 @@ void vertex_relation_copy_for_cluster(Relation OldTable, Relation NewTable,
469497
MultiXactId *multi_cutoff, double *num_tuples,
470498
double *tups_vacuumed, double *tups_recently_dead) {
471499
ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
472-
errmsg_internal("vertex_parallelscan_reinitialize not implemented")));
500+
errmsg_internal("vertex_relation_copy_for_cluster not implemented")));
473501
}
474502

475503
/*
@@ -491,7 +519,7 @@ void vertex_relation_vacuum(Relation rel, struct VacuumParams *params,
491519
BufferAccessStrategy bstrategy) {
492520

493521
ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
494-
errmsg_internal("vertex_parallelscan_reinitialize not implemented")));
522+
errmsg_internal("vertex_relation_vacuum not implemented")));
495523
}
496524

497525
/*
@@ -514,7 +542,7 @@ void vertex_relation_vacuum(Relation rel, struct VacuumParams *params,
514542
bool vertex_scan_analyze_next_block(TableScanDesc scan, BlockNumber blockno,
515543
BufferAccessStrategy bstrategy) {
516544
ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
517-
errmsg_internal("vertex_parallelscan_reinitialize not implemented")));
545+
errmsg_internal("vertex_scan_analyze_next_block not implemented")));
518546

519547
return false;
520548
}
@@ -530,7 +558,7 @@ bool vertex_scan_analyze_next_block(TableScanDesc scan, BlockNumber blockno,
530558
bool vertex_scan_analyze_next_tuple(TableScanDesc scan, TransactionId OldestXmin,
531559
double *liverows, double *deadrows, TupleTableSlot *slot) {
532560
ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
533-
errmsg_internal("vertex_parallelscan_reinitialize not implemented")));
561+
errmsg_internal("vertex_scan_analyze_next_tuple not implemented")));
534562

535563

536564

@@ -543,17 +571,21 @@ double vertex_index_build_range_scan(Relation table_rel, Relation index_rel,
543571
bool anyvisible, bool progress, BlockNumber start_blockno,
544572
BlockNumber numblocks, IndexBuildCallback callback,
545573
void *callback_state, TableScanDesc scan) {
546-
ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
547-
errmsg_internal("vertex_parallelscan_reinitialize not implemented")));
548-
return 0;
574+
Oid oid = get_relname_relid(make_vertex_adjlist_alias(get_rel_name(RelationGetRelid(table_rel))), get_rel_namespace(RelationGetRelid(table_rel)));
575+
576+
return GetHeapamTableAmRoutine()->index_build_range_scan(RelationIdGetRelation(oid),
577+
index_rel, index_info, allow_sync,
578+
anyvisible, progress, start_blockno,
579+
numblocks, callback, callback_state,
580+
scan);
549581
}
550582

551583
/* see table_index_validate_scan for reference about parameters */
552584
void vertex_index_validate_scan(Relation table_rel, Relation index_rel,
553585
struct IndexInfo *index_info, Snapshot snapshot,
554586
struct ValidateIndexState *state) {
555587
ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
556-
errmsg_internal("vertex_parallelscan_reinitialize not implemented")));
588+
errmsg_internal("vertex_index_validate_scan not implemented")));
557589
}
558590

559591

@@ -683,7 +715,7 @@ void vertex_relation_estimate_size(Relation rel, int32 *attr_widths,
683715
*/
684716
bool vertex_scan_bitmap_next_block(TableScanDesc scan, struct TBMIterateResult *tbmres) {
685717
ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
686-
errmsg_internal("vertex_parallelscan_reinitialize not implemented")));
718+
errmsg_internal("vertex_scan_bitmap_next_block not implemented")));
687719

688720
return false;
689721
}
@@ -702,7 +734,7 @@ bool vertex_scan_bitmap_next_block(TableScanDesc scan, struct TBMIterateResult *
702734
bool vertex_scan_bitmap_next_tuple(TableScanDesc scan, struct TBMIterateResult *tbmres,
703735
TupleTableSlot *slot) {
704736
ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
705-
errmsg_internal("vertex_parallelscan_reinitialize not implemented")));
737+
errmsg_internal("vertex_scan_bitmap_next_tuple not implemented")));
706738

707739
return false;
708740
}
@@ -734,7 +766,7 @@ bool vertex_scan_bitmap_next_tuple(TableScanDesc scan, struct TBMIterateResult *
734766
*/
735767
bool vertex_scan_sample_next_block(TableScanDesc scan, struct SampleScanState *scanstate) {
736768
ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
737-
errmsg_internal("vertex_parallelscan_reinitialize not implemented")));
769+
errmsg_internal("vertex_scan_sample_next_block not implemented")));
738770

739771
return false;
740772
}
@@ -756,7 +788,7 @@ bool vertex_scan_sample_next_tuple(TableScanDesc scan, struct SampleScanState *s
756788
TupleTableSlot *slot) {
757789

758790
ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
759-
errmsg_internal("vertex_parallelscan_reinitialize not implemented")));
791+
errmsg_internal("vertex_scan_sample_next_tuple not implemented")));
760792

761793
return false;
762794
}

0 commit comments

Comments
 (0)