blob: 056f1a967e51d6cf8e9381c3efc405a9e2df7af4 [file] [log] [blame]
/*
* 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