/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ #ifndef AG_CYPHER_UTILS_H #define AG_CYPHER_UTILS_H #include "access/heapam.h" #include "access/table.h" #include "access/tableam.h" #include "nodes/execnodes.h" #include "nodes/extensible.h" #include "nodes/nodes.h" #include "nodes/plannodes.h" #include "nodes/cypher_nodes.h" #include "utils/agtype.h" // declaration of a useful postgres macro that isn't in a header file #define DatumGetItemPointer(X) ((ItemPointer) DatumGetPointer(X)) #define ItemPointerGetDatum(X) PointerGetDatum(X) /* * When executing the children of the CREATE, SET, REMOVE, and * DELETE clauses, we need to alter the command id in the estate * and the snapshot. That way we can hide the modified tuples from * the sub clauses that should not know what their parent clauses are * doing. */ #define Increment_Estate_CommandId(estate) \ estate->es_output_cid++; \ estate->es_snapshot->curcid++; #define Decrement_Estate_CommandId(estate) \ estate->es_output_cid--; \ estate->es_snapshot->curcid--; #define DELETE_VERTEX_HTAB_NAME "delete_vertex_htab" #define DELETE_VERTEX_HTAB_SIZE 1000000 typedef struct cypher_create_custom_scan_state { CustomScanState css; CustomScan *cs; List *pattern; List *path_values; uint32 flags; TupleTableSlot *slot; Oid graph_oid; } cypher_create_custom_scan_state; typedef struct cypher_set_custom_scan_state { CustomScanState css; CustomScan *cs; cypher_update_information *set_list; int flags; } cypher_set_custom_scan_state; typedef struct cypher_delete_custom_scan_state { CustomScanState css; CustomScan *cs; cypher_delete_information *delete_data; int flags; List *edge_labels; /* * Deleted vertex IDs are stored in this hashtable. * * When a vertex item is deleted, it must be checked if there is any edges * connected to it. The connected edges are either deleted or an error is * thrown depending on the DETACH option. However, the check for connected * edges is not done immediately. Instead the deleted vertex IDs are stored * in the hashtable. Once all vertices are deleted, this hashtable is used * to process the connected edges with only one scan of the edge tables. * * Note on performance: Additional performance gain may be possible if * the standard DELETE .. USING .. command can be used instead of this * hashtable. Because Postgres may create a better plan to execute that * command depending on the statistics and available indexes on start_id * and end_id column. */ HTAB *vertex_id_htab; } cypher_delete_custom_scan_state; typedef struct cypher_merge_custom_scan_state { CustomScanState css; CustomScan *cs; cypher_merge_information *merge_information; int flags; cypher_create_path *path; List *path_values; Oid graph_oid; AttrNumber merge_function_attr; bool created_new_path; bool found_a_path; CommandId base_currentCommandId; } cypher_merge_custom_scan_state; TupleTableSlot *populate_vertex_tts(TupleTableSlot *elemTupleSlot, agtype_value *id, agtype_value *properties); TupleTableSlot *populate_edge_tts( TupleTableSlot *elemTupleSlot, agtype_value *id, agtype_value *startid, agtype_value *endid, agtype_value *properties); ResultRelInfo *create_entity_result_rel_info(EState *estate, char *graph_name, char *label_name); void destroy_entity_result_rel_info(ResultRelInfo *result_rel_info); bool entity_exists(EState *estate, Oid graph_oid, graphid id); HeapTuple insert_entity_tuple(ResultRelInfo *resultRelInfo, TupleTableSlot *elemTupleSlot, EState *estate); HeapTuple insert_entity_tuple_cid(ResultRelInfo *resultRelInfo, TupleTableSlot *elemTupleSlot, EState *estate, CommandId cid); #endif