UNPKG

@neo4j/graphql

Version:

A GraphQL to Cypher query execution layer for Neo4j and JavaScript GraphQL implementations

80 lines 3.54 kB
"use strict"; /* * Copyright (c) "Neo4j" * Neo4j Sweden AB [http://neo4j.com] * * This file is part of Neo4j. * * Licensed 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. */ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.CompositeCypherOperation = void 0; const cypher_builder_1 = __importDefault(require("@neo4j/cypher-builder")); const operations_1 = require("../operations"); class CompositeCypherOperation extends operations_1.Operation { constructor({ selection, partials, cypherAttributeField, }) { super(); this.selection = selection; this.partials = partials; this.cypherAttributeField = cypherAttributeField; } getChildren() { return [this.selection, ...this.partials]; } transpile(context) { // eslint-disable-next-line prefer-const let { selection: matchClause, nestedContext } = this.selection.apply(context); const returnVariable = new cypher_builder_1.default.Variable(); const partialContext = nestedContext.setReturn(returnVariable); if (!this.partials.length) { return { clauses: [cypher_builder_1.default.utils.concat(matchClause, new cypher_builder_1.default.Return(nestedContext.returnVariable))], projectionExpr: nestedContext.returnVariable, }; } const partialClauses = this.partials.map((partial) => { const { clauses } = partial.transpile(partialContext); return cypher_builder_1.default.utils.concat(new cypher_builder_1.default.With("*"), ...clauses); }); const partialsSubquery = new cypher_builder_1.default.Call(new cypher_builder_1.default.Union(...partialClauses), "*").return(partialContext.returnVariable); const returnExpr = this.getReturnExpression(nestedContext, returnVariable); const subquery = new cypher_builder_1.default.Call(partialsSubquery, [nestedContext.target]).return([ returnExpr, nestedContext.returnVariable, ]); return { clauses: [cypher_builder_1.default.utils.concat(matchClause, subquery)], projectionExpr: nestedContext.returnVariable, }; } getReturnExpression(context, returnVariable) { return this.wrapWithHeadIfNeeded(context, this.wrapWithCollectIfNeeded(context, returnVariable)); } wrapWithCollectIfNeeded(context, expr) { if (context.shouldCollect) { return cypher_builder_1.default.collect(expr); } return expr; } wrapWithHeadIfNeeded(context, expr) { if (context.shouldCollect && !this.cypherAttributeField.typeHelper.isList()) { return cypher_builder_1.default.head(expr); } return expr; } } exports.CompositeCypherOperation = CompositeCypherOperation; //# sourceMappingURL=CompositeCypherOperation.js.map