/* * 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_TRANSFORM_ENTITY_H #define AG_CYPHER_TRANSFORM_ENTITY_H #include "nodes/primnodes.h" #include "parser/parse_node.h" #include "nodes/cypher_nodes.h" #include "nodes/makefuncs.h" #include "parser/cypher_parse_node.h" enum transform_entity_type { ENT_VERTEX = 0x0, ENT_EDGE, ENT_VLE_EDGE, ENT_PATH }; enum transform_entity_join_side { JOIN_SIDE_LEFT = 0x0, JOIN_SIDE_RIGHT }; /* * In the transformation stage, we need to track * where a variable came from. When moving between * clauses, Postgres parsestate and Query data structures * are insufficient for some of the information we * need. */ typedef struct { // denotes whether this entity is a vertex or edge enum transform_entity_type type; /* * MATCH clauses are transformed into a select * FROM ... JOIN, etc * We need to know whether the table that this entity represents is * part of the join tree. If a cypher_node does not meet the conditions * set in INCLUDE_NODE_IN_JOIN_TREE. Then we can skip the node when * constructing our join tree. The entities around this particular entity * need to know this for the join to get properly constructed. */ bool in_join_tree; /* * The parse data structure will be transformed into an Expr that represents * the entity. When constructing the join tree, we need to know what it was * turned into. If the entity was originally created in a previous clause, * this will be a Var that we need to reference to extract the id, startid, * endid for the join. If the entity was created in the current clause, then * this will be a FuncExpr that we can reference to get the id, startid, and * endid. */ Expr *expr; /* * tells each clause whether this variable was * declared by itself or a previous clause. */ bool declared_in_current_clause; // The parse data structure that we transformed union { cypher_node *node; cypher_relationship *rel; cypher_path *path; } entity; } transform_entity; transform_entity *find_variable(cypher_parsestate *cpstate, char *name); transform_entity *find_transform_entity(cypher_parsestate *cpstate, char *name, enum transform_entity_type type); transform_entity *make_transform_entity(cypher_parsestate *cpstate, enum transform_entity_type type, Node *node, Expr *expr); char *get_entity_name(transform_entity *entity); Expr *get_relative_expr(transform_entity *entity, Index levelsup); #endif