Skip to content

Commit 188a767

Browse files
authored
Merge pull request #5933 from neo4j/revert-5908-7x-revert-create-always-on-connect
Revert "Revert "Merge pull request #5892 from mjfwebb/7x-connect-always-creat…"
2 parents 6baca05 + f10a964 commit 188a767

37 files changed

+293
-411
lines changed

.changeset/thick-dogs-provide.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@neo4j/graphql": major
3+
---
4+
5+
When performing a `connect` operation, new relationships are always created.

packages/graphql/src/translate/create-connect-and-params.test.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ describe("createConnectAndParams", () => {
138138
WITH connectedNodes, parentNodes
139139
UNWIND parentNodes as this
140140
UNWIND connectedNodes as this0_node
141-
MERGE (this)-[:\`SIMILAR\`]->(this0_node)
141+
CREATE (this)-[:\`SIMILAR\`]->(this0_node)
142142
}
143143
}
144144
WITH this, this0_node
@@ -153,7 +153,7 @@ describe("createConnectAndParams", () => {
153153
WITH connectedNodes, parentNodes
154154
UNWIND parentNodes as this0_node
155155
UNWIND connectedNodes as this0_node_similarMovies0_node
156-
MERGE (this0_node)-[:\`SIMILAR\`]->(this0_node_similarMovies0_node)
156+
CREATE (this0_node)-[:\`SIMILAR\`]->(this0_node_similarMovies0_node)
157157
}
158158
}
159159
WITH this, this0_node, this0_node_similarMovies0_node

packages/graphql/src/translate/create-connect-and-params.ts

+1-32
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ import { asArray } from "../utils/utils";
3333
import { checkAuthentication } from "./authorization/check-authentication";
3434
import { createAuthorizationAfterAndParams } from "./authorization/compatibility/create-authorization-after-and-params";
3535
import { createAuthorizationBeforeAndParams } from "./authorization/compatibility/create-authorization-before-and-params";
36-
import { createRelationshipValidationString } from "./create-relationship-validation-string";
3736
import { createSetRelationshipProperties } from "./create-set-relationship-properties";
3837
import { filterMetaVariable } from "./subscriptions/filter-meta-variable";
3938
import { createWhereNodePredicate } from "./where/create-where-predicate";
@@ -59,7 +58,6 @@ function createConnectAndParams({
5958
callbackBucket,
6059
labelOverride,
6160
parentNode,
62-
includeRelationshipValidation,
6361
isFirstLevel = true,
6462
source,
6563
indexPrefix,
@@ -74,7 +72,6 @@ function createConnectAndParams({
7472
refNodes: Node[];
7573
labelOverride?: string;
7674
parentNode: Node;
77-
includeRelationshipValidation?: boolean;
7875
isFirstLevel?: boolean;
7976
source: "CREATE" | "UPDATE" | "CONNECT";
8077
indexPrefix?: string;
@@ -95,7 +92,6 @@ function createConnectAndParams({
9592
const inStr = relationField.direction === "IN" ? "<-" : "-";
9693
const outStr = relationField.direction === "OUT" ? "->" : "-";
9794
const relTypeStr = `[${relationField.properties ? relationshipName : ""}:${relationField.type}]`;
98-
const isOverwriteNotAllowed = connect.overwrite === false;
9995

10096
const subquery: string[] = [];
10197
const labels = relatedNode.getLabelString(context);
@@ -174,8 +170,7 @@ function createConnectAndParams({
174170
subquery.push("\t\t\tWITH connectedNodes, parentNodes"); //
175171
subquery.push(`\t\t\tUNWIND parentNodes as ${parentVar}`);
176172
subquery.push(`\t\t\tUNWIND connectedNodes as ${nodeName}`);
177-
const connectOperator = isOverwriteNotAllowed ? "CREATE" : "MERGE";
178-
subquery.push(`\t\t\t${connectOperator} (${parentVar})${inStr}${relTypeStr}${outStr}(${nodeName})`);
173+
subquery.push(`\t\t\tCREATE (${parentVar})${inStr}${relTypeStr}${outStr}(${nodeName})`);
179174

180175
if (relationField.properties) {
181176
const relationship = context.relationships.find(
@@ -215,31 +210,6 @@ function createConnectAndParams({
215210

216211
const innerMetaStr = "";
217212

218-
if (includeRelationshipValidation || isOverwriteNotAllowed) {
219-
const relValidationStrs: string[] = [];
220-
const matrixItems = [
221-
[parentNode, parentVar],
222-
[relatedNode, nodeName],
223-
] as [Node, string][];
224-
225-
matrixItems.forEach((mi) => {
226-
const relValidationStr = createRelationshipValidationString({
227-
node: mi[0],
228-
context,
229-
varName: mi[1],
230-
...(isOverwriteNotAllowed && { relationshipFieldNotOverwritable: relationField.fieldName }),
231-
});
232-
if (relValidationStr) {
233-
relValidationStrs.push(relValidationStr);
234-
}
235-
});
236-
237-
if (relValidationStrs.length) {
238-
subquery.push(`\tWITH ${[...filterMetaVariable(withVars), nodeName].join(", ")}${innerMetaStr}`);
239-
subquery.push(relValidationStrs.join("\n"));
240-
}
241-
}
242-
243213
subquery.push(`WITH ${[...filterMetaVariable(withVars), nodeName].join(", ")}${innerMetaStr}`);
244214

245215
if (connect.connect) {
@@ -275,7 +245,6 @@ function createConnectAndParams({
275245
refNodes: [newRefNode],
276246
parentNode: relatedNode,
277247
labelOverride: relField.union ? newRefNode.name : "",
278-
includeRelationshipValidation: true,
279248
isFirstLevel: false,
280249
source: "CONNECT",
281250
});

packages/graphql/src/translate/create-create-and-params.ts

-23
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ import {
2727
createAuthorizationAfterAndParamsField,
2828
} from "./authorization/compatibility/create-authorization-after-and-params";
2929
import createConnectAndParams from "./create-connect-and-params";
30-
import { createRelationshipValidationString } from "./create-relationship-validation-string";
3130
import { createSetRelationshipProperties } from "./create-set-relationship-properties";
3231
import { assertNonAmbiguousUpdate } from "./utils/assert-non-ambiguous-update";
3332
import { addCallbackAndSetParam } from "./utils/callback-utils";
@@ -57,7 +56,6 @@ function createCreateAndParams({
5756
context,
5857
callbackBucket,
5958
withVars,
60-
includeRelationshipValidation,
6159
topLevelNodeVariable,
6260
authorizationPrefix = [0],
6361
}: {
@@ -67,7 +65,6 @@ function createCreateAndParams({
6765
context: Neo4jGraphQLTranslationContext;
6866
callbackBucket: CallbackBucket;
6967
withVars: string[];
70-
includeRelationshipValidation?: boolean;
7168
topLevelNodeVariable?: string;
7269
//used to build authorization variable in auth subqueries
7370
authorizationPrefix?: number[];
@@ -144,7 +141,6 @@ function createCreateAndParams({
144141
node: refNode,
145142
varName: nodeName,
146143
withVars: [...withVars, nodeName],
147-
includeRelationshipValidation: false,
148144
topLevelNodeVariable,
149145
authorizationPrefix: [...authorizationPrefix, reducerIndex, createIndex, refNodeIndex],
150146
});
@@ -184,16 +180,6 @@ function createCreateAndParams({
184180
}
185181
res.meta.authorizationPredicates.push(...authorizationPredicates);
186182
}
187-
188-
const relationshipValidationStr = createRelationshipValidationString({
189-
node: refNode,
190-
context,
191-
varName: nodeName,
192-
});
193-
if (relationshipValidationStr) {
194-
res.creates.push(`WITH *`);
195-
res.creates.push(relationshipValidationStr);
196-
}
197183
});
198184
}
199185

@@ -331,15 +317,6 @@ function createCreateAndParams({
331317
params = { ...params, ...authParams };
332318
}
333319

334-
if (includeRelationshipValidation) {
335-
const str = createRelationshipValidationString({ node, context, varName });
336-
337-
if (str) {
338-
creates.push(`WITH *`);
339-
creates.push(str);
340-
}
341-
}
342-
343320
return { create: creates.join("\n"), params, authorizationPredicates, authorizationSubqueries };
344321
}
345322

packages/graphql/src/translate/create-relationship-validation-string.ts

-93
This file was deleted.

packages/graphql/src/translate/create-update-and-params.ts

+1-30
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ import createConnectAndParams from "./create-connect-and-params";
3838
import createCreateAndParams from "./create-create-and-params";
3939
import createDeleteAndParams from "./create-delete-and-params";
4040
import createDisconnectAndParams from "./create-disconnect-and-params";
41-
import { createRelationshipValidationString } from "./create-relationship-validation-string";
4241
import { createSetRelationshipProperties } from "./create-set-relationship-properties";
4342
import { assertNonAmbiguousUpdate } from "./utils/assert-non-ambiguous-update";
4443
import { addCallbackAndSetParam } from "./utils/callback-utils";
@@ -73,7 +72,6 @@ export default function createUpdateAndParams({
7372
context,
7473
callbackBucket,
7574
parameterPrefix,
76-
includeRelationshipValidation,
7775
}: {
7876
parentVar: string;
7977
updateInput: any;
@@ -84,7 +82,6 @@ export default function createUpdateAndParams({
8482
context: Neo4jGraphQLTranslationContext;
8583
callbackBucket: CallbackBucket;
8684
parameterPrefix: string;
87-
includeRelationshipValidation?: boolean;
8885
}): [string, any] {
8986
let hasAppliedTimeStamps = false;
9087

@@ -306,7 +303,6 @@ export default function createUpdateAndParams({
306303
parameterPrefix: `${parameterPrefix}.${key}${
307304
relationField.union ? `.${refNode.name}` : ""
308305
}${relationField.typeMeta.array ? `[${index}]` : ``}.update.node`,
309-
includeRelationshipValidation: true,
310306
});
311307
res.params = { ...res.params, ...updateAndParams[1] };
312308
innerUpdate.push(updateAndParams[0]);
@@ -429,7 +425,6 @@ export default function createUpdateAndParams({
429425
callbackBucket,
430426
varName: nodeName,
431427
withVars: [...withVars, nodeName],
432-
includeRelationshipValidation: false,
433428
...createNodeInput,
434429
});
435430
subquery.push(nestedCreate);
@@ -465,16 +460,6 @@ export default function createUpdateAndParams({
465460
subquery.push(
466461
...getAuthorizationStatements(authorizationPredicates, authorizationSubqueries)
467462
);
468-
469-
const relationshipValidationStr = createRelationshipValidationString({
470-
node: refNode,
471-
context,
472-
varName: nodeName,
473-
});
474-
if (relationshipValidationStr) {
475-
subquery.push(`WITH ${[...withVars, nodeName].join(", ")}`);
476-
subquery.push(relationshipValidationStr);
477-
}
478463
});
479464
}
480465

@@ -626,11 +611,6 @@ export default function createUpdateAndParams({
626611

627612
const preUpdatePredicates = authorizationBeforeStrs;
628613

629-
const preArrayMethodValidationStr = "";
630-
const relationshipValidationStr = includeRelationshipValidation
631-
? createRelationshipValidationString({ node, context, varName })
632-
: "";
633-
634614
if (meta.preArrayMethodValidationStrs.length) {
635615
const nullChecks = meta.preArrayMethodValidationStrs.map((validationStr) => `${validationStr[0]} IS NULL`);
636616
const propertyNames = meta.preArrayMethodValidationStrs.map((validationStr) => validationStr[1]);
@@ -670,16 +650,7 @@ export default function createUpdateAndParams({
670650

671651
const statements = strs;
672652

673-
return [
674-
[
675-
preUpdatePredicatesStr,
676-
preArrayMethodValidationStr,
677-
...statements,
678-
authorizationAfterStr,
679-
...(relationshipValidationStr ? [withStr, relationshipValidationStr] : []),
680-
].join("\n"),
681-
params,
682-
];
653+
return [[preUpdatePredicatesStr, ...statements, authorizationAfterStr].join("\n"), params];
683654
}
684655

685656
function validateNonNullProperty(res: Res, varName: string, field: BaseField) {

packages/graphql/src/translate/translate-create.ts

-1
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,6 @@ export default async function translateCreate({
8484
context,
8585
varName,
8686
withVars,
87-
includeRelationshipValidation: true,
8887
topLevelNodeVariable: varName,
8988
callbackBucket,
9089
});

0 commit comments

Comments
 (0)