@neo4j/graphql
Version:
A GraphQL to Cypher query execution layer for Neo4j and JavaScript GraphQL implementations
226 lines • 12.4 kB
JavaScript
;
/*
* 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.augmentWhereInputWithRelationshipFilters = augmentWhereInputWithRelationshipFilters;
exports.getRelationshipFilters = getRelationshipFilters;
exports.fieldConfigsToFieldConfigMap = fieldConfigsToFieldConfigMap;
const pluralize_1 = __importDefault(require("pluralize"));
const constants_1 = require("../../constants");
const utils_1 = require("./utils");
function augmentWhereInputWithRelationshipFilters({ whereInput, composer, relationshipAdapter, deprecatedDirectives, features, }) {
if (!relationshipAdapter.isFilterableByAggregate() && !relationshipAdapter.isFilterableByValue()) {
return {};
}
if (relationshipAdapter.isFilterableByValue()) {
// Relationship filters
const relationshipFiltersFields = fieldConfigsToFieldConfigMap({
deprecatedDirectives,
fields: getRelationshipFilters({ relationshipAdapter }),
});
composer.getOrCreateITC(relationshipAdapter.operations.relationshipFiltersTypeName, (itc) => {
itc.addFields(relationshipFiltersFields);
});
whereInput.addFields({
[relationshipAdapter.name]: {
type: relationshipAdapter.operations.relationshipFiltersTypeName,
},
});
if ((0, utils_1.shouldAddDeprecatedFields)(features, "relationshipFilters")) {
// Add relationship legacy filter fields
const legacyRelationship = fieldConfigsToFieldConfigMap({
deprecatedDirectives,
fields: getRelationshipFiltersLegacy(relationshipAdapter),
});
whereInput.addFields(legacyRelationship);
// Add connection legacy filter fields
const legacyConnection = fieldConfigsToFieldConfigMap({
deprecatedDirectives,
fields: getRelationshipConnectionFiltersLegacy(relationshipAdapter),
});
whereInput.addFields(legacyConnection);
}
}
// Connection filters
// Connection filters are generated for both aggregation filters and value filters.
const connectionFiltersFields = fieldConfigsToFieldConfigMap({
deprecatedDirectives,
fields: getRelationshipConnectionFilters(relationshipAdapter),
});
composer.getOrCreateITC(relationshipAdapter.operations.connectionFiltersTypeName, (itc) => {
itc.addFields(connectionFiltersFields);
});
whereInput.addFields({
[relationshipAdapter.operations.connectionFieldName]: {
type: relationshipAdapter.operations.connectionFiltersTypeName,
},
});
}
// exported as reused by Cypher filters
function getRelationshipFilters({ relationshipInfo, relationshipAdapter, }) {
if (relationshipAdapter) {
return getRelationshipFiltersUsingOptions({
targetName: relationshipAdapter.target.name,
inputTypeName: relationshipAdapter.target.operations.whereInputTypeName,
});
}
else if (relationshipInfo) {
return getRelationshipFiltersUsingOptions(relationshipInfo);
}
throw new Error("Either relationshipInfo or relationshipAdapter must be provided to getRelationshipFilters method");
}
function getRelationshipFiltersUsingOptions({ targetName, inputTypeName, }) {
return [
{
name: "all",
typeName: inputTypeName,
description: `Filter type where all of the related ${(0, pluralize_1.default)(targetName)} match this filter`,
},
{
name: "none",
typeName: inputTypeName,
description: `Filter type where none of the related ${(0, pluralize_1.default)(targetName)} match this filter`,
},
{
name: "single",
typeName: inputTypeName,
description: `Filter type where one of the related ${(0, pluralize_1.default)(targetName)} match this filter`,
},
{
name: "some",
typeName: inputTypeName,
description: `Filter type where some of the related ${(0, pluralize_1.default)(targetName)} match this filter`,
},
];
}
function getRelationshipConnectionFilters(relationshipAdapter) {
const connectionFilters = [];
if (relationshipAdapter.isFilterableByValue()) {
connectionFilters.push(...[
{
name: "all",
typeName: relationshipAdapter.operations.getConnectionWhereTypename(),
description: `Return ${(0, pluralize_1.default)(relationshipAdapter.source.name)} where all of the related ${(0, pluralize_1.default)(relationshipAdapter.operations.connectionFieldTypename)} match this filter`,
},
{
name: "none",
typeName: relationshipAdapter.operations.getConnectionWhereTypename(),
description: `Return ${(0, pluralize_1.default)(relationshipAdapter.source.name)} where none of the related ${(0, pluralize_1.default)(relationshipAdapter.operations.connectionFieldTypename)} match this filter`,
},
{
name: "single",
typeName: relationshipAdapter.operations.getConnectionWhereTypename(),
description: `Return ${(0, pluralize_1.default)(relationshipAdapter.source.name)} where one of the related ${(0, pluralize_1.default)(relationshipAdapter.operations.connectionFieldTypename)} match this filter`,
},
{
name: "some",
typeName: relationshipAdapter.operations.getConnectionWhereTypename(),
description: `Return ${(0, pluralize_1.default)(relationshipAdapter.source.name)} where some of the related ${(0, pluralize_1.default)(relationshipAdapter.operations.connectionFieldTypename)} match this filter`,
},
]);
}
if (relationshipAdapter.isFilterableByAggregate()) {
connectionFilters.push({
name: "aggregate",
typeName: relationshipAdapter.operations.connectionAggregateInputTypeName,
description: `Filter ${(0, pluralize_1.default)(relationshipAdapter.source.name)} by aggregating results on related ${(0, pluralize_1.default)(relationshipAdapter.operations.connectionFieldTypename)}`,
});
}
return connectionFilters;
}
function getRelationshipFiltersLegacy(relationshipAdapter) {
return [
{
name: `${relationshipAdapter.name}_ALL`,
typeName: relationshipAdapter.target.operations.whereInputTypeName,
description: `Return ${(0, pluralize_1.default)(relationshipAdapter.source.name)} where all of the related ${(0, pluralize_1.default)(relationshipAdapter.target.name)} match this filter`,
deprecationReason: `Please use the relevant generic filter '${relationshipAdapter.name}: { all: ... }' instead.`,
},
{
name: `${relationshipAdapter.name}_NONE`,
typeName: relationshipAdapter.target.operations.whereInputTypeName,
description: `Return ${(0, pluralize_1.default)(relationshipAdapter.source.name)} where none of the related ${(0, pluralize_1.default)(relationshipAdapter.target.name)} match this filter`,
deprecationReason: `Please use the relevant generic filter '${relationshipAdapter.name}: { none: ... }' instead.`,
},
{
name: `${relationshipAdapter.name}_SINGLE`,
typeName: relationshipAdapter.target.operations.whereInputTypeName,
description: `Return ${(0, pluralize_1.default)(relationshipAdapter.source.name)} where one of the related ${(0, pluralize_1.default)(relationshipAdapter.target.name)} match this filter`,
deprecationReason: `Please use the relevant generic filter '${relationshipAdapter.name}: { single: ... }' instead.`,
},
{
name: `${relationshipAdapter.name}_SOME`,
typeName: relationshipAdapter.target.operations.whereInputTypeName,
description: `Return ${(0, pluralize_1.default)(relationshipAdapter.source.name)} where some of the related ${(0, pluralize_1.default)(relationshipAdapter.target.name)} match this filter`,
deprecationReason: `Please use the relevant generic filter '${relationshipAdapter.name}: { some: ... }' instead.`,
},
];
}
function getRelationshipConnectionFiltersLegacy(relationshipAdapter) {
return [
{
name: `${relationshipAdapter.operations.connectionFieldName}_ALL`,
typeName: relationshipAdapter.operations.getConnectionWhereTypename(),
description: `Return ${(0, pluralize_1.default)(relationshipAdapter.source.name)} where all of the related ${(0, pluralize_1.default)(relationshipAdapter.operations.connectionFieldTypename)} match this filter`,
deprecationReason: `Please use the relevant generic filter '${relationshipAdapter.operations.connectionFieldName}: { all: { node: ... } } }' instead.`,
},
{
name: `${relationshipAdapter.operations.connectionFieldName}_NONE`,
typeName: relationshipAdapter.operations.getConnectionWhereTypename(),
description: `Return ${(0, pluralize_1.default)(relationshipAdapter.source.name)} where none of the related ${(0, pluralize_1.default)(relationshipAdapter.operations.connectionFieldTypename)} match this filter`,
deprecationReason: `Please use the relevant generic filter '${relationshipAdapter.operations.connectionFieldName}: { none: { node: ... } } }' instead.`,
},
{
name: `${relationshipAdapter.operations.connectionFieldName}_SINGLE`,
typeName: relationshipAdapter.operations.getConnectionWhereTypename(),
description: `Return ${(0, pluralize_1.default)(relationshipAdapter.source.name)} where one of the related ${(0, pluralize_1.default)(relationshipAdapter.operations.connectionFieldTypename)} match this filter`,
deprecationReason: `Please use the relevant generic filter '${relationshipAdapter.operations.connectionFieldName}: { single: { node: ... } } }' instead.`,
},
{
name: `${relationshipAdapter.operations.connectionFieldName}_SOME`,
typeName: relationshipAdapter.operations.getConnectionWhereTypename(),
description: `Return ${(0, pluralize_1.default)(relationshipAdapter.source.name)} where some of the related ${(0, pluralize_1.default)(relationshipAdapter.operations.connectionFieldTypename)} match this filter`,
deprecationReason: `Please use the relevant generic filter '${relationshipAdapter.operations.connectionFieldName}: { some: { node: ... } } }' instead.`,
},
];
}
// NOTE: This used to be a specialized function used specifically to generate relationship fields,
// but now after this refactor, it could be used as schema composer utility if needed.
function fieldConfigsToFieldConfigMap({ deprecatedDirectives, fields, }) {
const fieldsConfigMap = {};
for (const field of fields) {
let directives;
if (deprecatedDirectives.length) {
directives = deprecatedDirectives;
}
else if (field.deprecationReason) {
directives = [{ name: constants_1.DEPRECATED, args: { reason: field.deprecationReason } }];
}
fieldsConfigMap[field.name] = {
type: field.typeName,
directives,
description: field.description,
};
}
return fieldsConfigMap;
}
//# sourceMappingURL=augment-where-input.js.map