UNPKG

@neo4j/graphql

Version:

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

81 lines 3.67 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.VectorOperation = void 0; const cypher_builder_1 = __importDefault(require("@neo4j/cypher-builder")); const utils_1 = require("../../../../utils/utils"); const ScoreSort_1 = require("../sort/ScoreSort"); const ConnectionReadOperation_1 = require("./ConnectionReadOperation"); class VectorOperation extends ConnectionReadOperation_1.ConnectionReadOperation { constructor({ target, relationship, scoreField, selection, }) { super({ target, relationship, selection, }); this.scoreField = scoreField; } getChildren() { return (0, utils_1.filterTruthy)([...super.getChildren(), this.scoreField]); } createProjectionMapForEdge(context) { const edgeProjectionMap = new cypher_builder_1.default.Map(); edgeProjectionMap.set("node", this.createProjectionMapForNode(context)); if (this.scoreField && context.neo4jGraphQLContext.vector) { edgeProjectionMap.set("score", context.neo4jGraphQLContext.vector.scoreVariable); } return edgeProjectionMap; } getUnwindClause(context, edgeVar, edgesVar) { if ((this.scoreField || this.hasScoreSort()) && context.neo4jGraphQLContext.vector) { // No relationship, so we directly unwind node and score return new cypher_builder_1.default.Unwind([edgesVar, edgeVar]).with([edgeVar.property("node"), context.target], [edgeVar.property("score"), context.neo4jGraphQLContext.vector.scoreVariable]); } else { return super.getUnwindClause(context, edgeVar, edgesVar); } } getWithCollectEdgesAndTotalCount(nestedContext, edgesVar, totalCount) { if ((this.scoreField || this.hasScoreSort()) && nestedContext.neo4jGraphQLContext.vector) { const nodeAndRelationshipMap = new cypher_builder_1.default.Map({ node: nestedContext.target, }); if (nestedContext.relationship) { nodeAndRelationshipMap.set("relationship", nestedContext.relationship); } nodeAndRelationshipMap.set("score", nestedContext.neo4jGraphQLContext.vector.scoreVariable); return new cypher_builder_1.default.With([cypher_builder_1.default.collect(nodeAndRelationshipMap), edgesVar]).with(edgesVar, [ cypher_builder_1.default.size(edgesVar), totalCount, ]); } else { return super.getWithCollectEdgesAndTotalCount(nestedContext, edgesVar, totalCount); } } hasScoreSort() { return this.sortFields.some(({ node }) => node.some((sort) => sort instanceof ScoreSort_1.ScoreSort)); } } exports.VectorOperation = VectorOperation; //# sourceMappingURL=VectorOperation.js.map