grafeo-ogm 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +1121 -0
- package/dist/cjs/compilers/fulltext.compiler.d.ts +67 -0
- package/dist/cjs/compilers/fulltext.compiler.d.ts.map +1 -0
- package/dist/cjs/compilers/fulltext.compiler.js +254 -0
- package/dist/cjs/compilers/fulltext.compiler.js.map +1 -0
- package/dist/cjs/compilers/mutation.compiler.d.ts +126 -0
- package/dist/cjs/compilers/mutation.compiler.d.ts.map +1 -0
- package/dist/cjs/compilers/mutation.compiler.js +1239 -0
- package/dist/cjs/compilers/mutation.compiler.js.map +1 -0
- package/dist/cjs/compilers/select-normalizer.d.ts +50 -0
- package/dist/cjs/compilers/select-normalizer.d.ts.map +1 -0
- package/dist/cjs/compilers/select-normalizer.js +225 -0
- package/dist/cjs/compilers/select-normalizer.js.map +1 -0
- package/dist/cjs/compilers/selection.compiler.d.ts +113 -0
- package/dist/cjs/compilers/selection.compiler.d.ts.map +1 -0
- package/dist/cjs/compilers/selection.compiler.js +410 -0
- package/dist/cjs/compilers/selection.compiler.js.map +1 -0
- package/dist/cjs/compilers/where.compiler.d.ts +39 -0
- package/dist/cjs/compilers/where.compiler.d.ts.map +1 -0
- package/dist/cjs/compilers/where.compiler.js +456 -0
- package/dist/cjs/compilers/where.compiler.js.map +1 -0
- package/dist/cjs/errors.d.ts +28 -0
- package/dist/cjs/errors.d.ts.map +1 -0
- package/dist/cjs/errors.js +42 -0
- package/dist/cjs/errors.js.map +1 -0
- package/dist/cjs/execution/executor.d.ts +38 -0
- package/dist/cjs/execution/executor.d.ts.map +1 -0
- package/dist/cjs/execution/executor.js +50 -0
- package/dist/cjs/execution/executor.js.map +1 -0
- package/dist/cjs/execution/result-mapper.d.ts +26 -0
- package/dist/cjs/execution/result-mapper.d.ts.map +1 -0
- package/dist/cjs/execution/result-mapper.js +92 -0
- package/dist/cjs/execution/result-mapper.js.map +1 -0
- package/dist/cjs/generator/generate-types.d.ts +55 -0
- package/dist/cjs/generator/generate-types.d.ts.map +1 -0
- package/dist/cjs/generator/generate-types.js +181 -0
- package/dist/cjs/generator/generate-types.js.map +1 -0
- package/dist/cjs/generator/index.d.ts +3 -0
- package/dist/cjs/generator/index.d.ts.map +1 -0
- package/dist/cjs/generator/index.js +6 -0
- package/dist/cjs/generator/index.js.map +1 -0
- package/dist/cjs/generator/type-emitters/aggregation-emitter.d.ts +7 -0
- package/dist/cjs/generator/type-emitters/aggregation-emitter.d.ts.map +1 -0
- package/dist/cjs/generator/type-emitters/aggregation-emitter.js +196 -0
- package/dist/cjs/generator/type-emitters/aggregation-emitter.js.map +1 -0
- package/dist/cjs/generator/type-emitters/connection-emitter.d.ts +22 -0
- package/dist/cjs/generator/type-emitters/connection-emitter.d.ts.map +1 -0
- package/dist/cjs/generator/type-emitters/connection-emitter.js +270 -0
- package/dist/cjs/generator/type-emitters/connection-emitter.js.map +1 -0
- package/dist/cjs/generator/type-emitters/enum-emitter.d.ts +7 -0
- package/dist/cjs/generator/type-emitters/enum-emitter.d.ts.map +1 -0
- package/dist/cjs/generator/type-emitters/enum-emitter.js +45 -0
- package/dist/cjs/generator/type-emitters/enum-emitter.js.map +1 -0
- package/dist/cjs/generator/type-emitters/fulltext-emitter.d.ts +15 -0
- package/dist/cjs/generator/type-emitters/fulltext-emitter.d.ts.map +1 -0
- package/dist/cjs/generator/type-emitters/fulltext-emitter.js +80 -0
- package/dist/cjs/generator/type-emitters/fulltext-emitter.js.map +1 -0
- package/dist/cjs/generator/type-emitters/helpers.d.ts +32 -0
- package/dist/cjs/generator/type-emitters/helpers.d.ts.map +1 -0
- package/dist/cjs/generator/type-emitters/helpers.js +69 -0
- package/dist/cjs/generator/type-emitters/helpers.js.map +1 -0
- package/dist/cjs/generator/type-emitters/input-emitter.d.ts +6 -0
- package/dist/cjs/generator/type-emitters/input-emitter.d.ts.map +1 -0
- package/dist/cjs/generator/type-emitters/input-emitter.js +560 -0
- package/dist/cjs/generator/type-emitters/input-emitter.js.map +1 -0
- package/dist/cjs/generator/type-emitters/interface-emitter.d.ts +10 -0
- package/dist/cjs/generator/type-emitters/interface-emitter.d.ts.map +1 -0
- package/dist/cjs/generator/type-emitters/interface-emitter.js +88 -0
- package/dist/cjs/generator/type-emitters/interface-emitter.js.map +1 -0
- package/dist/cjs/generator/type-emitters/model-map-emitter.d.ts +32 -0
- package/dist/cjs/generator/type-emitters/model-map-emitter.d.ts.map +1 -0
- package/dist/cjs/generator/type-emitters/model-map-emitter.js +154 -0
- package/dist/cjs/generator/type-emitters/model-map-emitter.js.map +1 -0
- package/dist/cjs/generator/type-emitters/mutation-response-emitter.d.ts +9 -0
- package/dist/cjs/generator/type-emitters/mutation-response-emitter.d.ts.map +1 -0
- package/dist/cjs/generator/type-emitters/mutation-response-emitter.js +69 -0
- package/dist/cjs/generator/type-emitters/mutation-response-emitter.js.map +1 -0
- package/dist/cjs/generator/type-emitters/node-type-emitter.d.ts +13 -0
- package/dist/cjs/generator/type-emitters/node-type-emitter.d.ts.map +1 -0
- package/dist/cjs/generator/type-emitters/node-type-emitter.js +123 -0
- package/dist/cjs/generator/type-emitters/node-type-emitter.js.map +1 -0
- package/dist/cjs/generator/type-emitters/select-fields-emitter.d.ts +8 -0
- package/dist/cjs/generator/type-emitters/select-fields-emitter.d.ts.map +1 -0
- package/dist/cjs/generator/type-emitters/select-fields-emitter.js +169 -0
- package/dist/cjs/generator/type-emitters/select-fields-emitter.js.map +1 -0
- package/dist/cjs/generator/type-emitters/select-result-emitter.d.ts +9 -0
- package/dist/cjs/generator/type-emitters/select-result-emitter.d.ts.map +1 -0
- package/dist/cjs/generator/type-emitters/select-result-emitter.js +61 -0
- package/dist/cjs/generator/type-emitters/select-result-emitter.js.map +1 -0
- package/dist/cjs/generator/type-emitters/sort-options-emitter.d.ts +8 -0
- package/dist/cjs/generator/type-emitters/sort-options-emitter.d.ts.map +1 -0
- package/dist/cjs/generator/type-emitters/sort-options-emitter.js +47 -0
- package/dist/cjs/generator/type-emitters/sort-options-emitter.js.map +1 -0
- package/dist/cjs/generator/type-emitters/utility-types.d.ts +10 -0
- package/dist/cjs/generator/type-emitters/utility-types.d.ts.map +1 -0
- package/dist/cjs/generator/type-emitters/utility-types.js +93 -0
- package/dist/cjs/generator/type-emitters/utility-types.js.map +1 -0
- package/dist/cjs/generator/type-emitters/where-emitter.d.ts +15 -0
- package/dist/cjs/generator/type-emitters/where-emitter.d.ts.map +1 -0
- package/dist/cjs/generator/type-emitters/where-emitter.js +189 -0
- package/dist/cjs/generator/type-emitters/where-emitter.js.map +1 -0
- package/dist/cjs/index.d.ts +30 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +59 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/interface-model.d.ts +158 -0
- package/dist/cjs/interface-model.d.ts.map +1 -0
- package/dist/cjs/interface-model.js +214 -0
- package/dist/cjs/interface-model.js.map +1 -0
- package/dist/cjs/model.d.ts +354 -0
- package/dist/cjs/model.d.ts.map +1 -0
- package/dist/cjs/model.js +513 -0
- package/dist/cjs/model.js.map +1 -0
- package/dist/cjs/ogm.d.ts +97 -0
- package/dist/cjs/ogm.d.ts.map +1 -0
- package/dist/cjs/ogm.js +224 -0
- package/dist/cjs/ogm.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/schema/parser.d.ts +12 -0
- package/dist/cjs/schema/parser.d.ts.map +1 -0
- package/dist/cjs/schema/parser.js +331 -0
- package/dist/cjs/schema/parser.js.map +1 -0
- package/dist/cjs/schema/types.d.ts +66 -0
- package/dist/cjs/schema/types.d.ts.map +1 -0
- package/dist/cjs/schema/types.js +3 -0
- package/dist/cjs/schema/types.js.map +1 -0
- package/dist/cjs/schema/utils.d.ts +23 -0
- package/dist/cjs/schema/utils.d.ts.map +1 -0
- package/dist/cjs/schema/utils.js +92 -0
- package/dist/cjs/schema/utils.js.map +1 -0
- package/dist/cjs/subgraph/index.d.ts +3 -0
- package/dist/cjs/subgraph/index.d.ts.map +1 -0
- package/dist/cjs/subgraph/index.js +7 -0
- package/dist/cjs/subgraph/index.js.map +1 -0
- package/dist/cjs/subgraph/subgraph-operations.d.ts +34 -0
- package/dist/cjs/subgraph/subgraph-operations.d.ts.map +1 -0
- package/dist/cjs/subgraph/subgraph-operations.js +225 -0
- package/dist/cjs/subgraph/subgraph-operations.js.map +1 -0
- package/dist/cjs/subgraph/types.d.ts +23 -0
- package/dist/cjs/subgraph/types.d.ts.map +1 -0
- package/dist/cjs/subgraph/types.js +3 -0
- package/dist/cjs/subgraph/types.js.map +1 -0
- package/dist/cjs/testing/cypher-assert.d.ts +35 -0
- package/dist/cjs/testing/cypher-assert.d.ts.map +1 -0
- package/dist/cjs/testing/cypher-assert.js +72 -0
- package/dist/cjs/testing/cypher-assert.js.map +1 -0
- package/dist/cjs/testing/index.d.ts +4 -0
- package/dist/cjs/testing/index.d.ts.map +1 -0
- package/dist/cjs/testing/index.js +10 -0
- package/dist/cjs/testing/index.js.map +1 -0
- package/dist/cjs/testing/neo4j-record-factory.d.ts +25 -0
- package/dist/cjs/testing/neo4j-record-factory.d.ts.map +1 -0
- package/dist/cjs/testing/neo4j-record-factory.js +43 -0
- package/dist/cjs/testing/neo4j-record-factory.js.map +1 -0
- package/dist/cjs/testing/selection-set-factory.d.ts +24 -0
- package/dist/cjs/testing/selection-set-factory.d.ts.map +1 -0
- package/dist/cjs/testing/selection-set-factory.js +44 -0
- package/dist/cjs/testing/selection-set-factory.js.map +1 -0
- package/dist/cjs/utils/lucene.d.ts +9 -0
- package/dist/cjs/utils/lucene.d.ts.map +1 -0
- package/dist/cjs/utils/lucene.js +25 -0
- package/dist/cjs/utils/lucene.js.map +1 -0
- package/dist/cjs/utils/validation.d.ts +25 -0
- package/dist/cjs/utils/validation.d.ts.map +1 -0
- package/dist/cjs/utils/validation.js +53 -0
- package/dist/cjs/utils/validation.js.map +1 -0
- package/dist/esm/compilers/fulltext.compiler.d.ts +67 -0
- package/dist/esm/compilers/fulltext.compiler.d.ts.map +1 -0
- package/dist/esm/compilers/fulltext.compiler.js +250 -0
- package/dist/esm/compilers/fulltext.compiler.js.map +1 -0
- package/dist/esm/compilers/mutation.compiler.d.ts +126 -0
- package/dist/esm/compilers/mutation.compiler.d.ts.map +1 -0
- package/dist/esm/compilers/mutation.compiler.js +1235 -0
- package/dist/esm/compilers/mutation.compiler.js.map +1 -0
- package/dist/esm/compilers/select-normalizer.d.ts +50 -0
- package/dist/esm/compilers/select-normalizer.d.ts.map +1 -0
- package/dist/esm/compilers/select-normalizer.js +221 -0
- package/dist/esm/compilers/select-normalizer.js.map +1 -0
- package/dist/esm/compilers/selection.compiler.d.ts +113 -0
- package/dist/esm/compilers/selection.compiler.d.ts.map +1 -0
- package/dist/esm/compilers/selection.compiler.js +406 -0
- package/dist/esm/compilers/selection.compiler.js.map +1 -0
- package/dist/esm/compilers/where.compiler.d.ts +39 -0
- package/dist/esm/compilers/where.compiler.d.ts.map +1 -0
- package/dist/esm/compilers/where.compiler.js +452 -0
- package/dist/esm/compilers/where.compiler.js.map +1 -0
- package/dist/esm/errors.d.ts +28 -0
- package/dist/esm/errors.d.ts.map +1 -0
- package/dist/esm/errors.js +36 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/execution/executor.d.ts +38 -0
- package/dist/esm/execution/executor.d.ts.map +1 -0
- package/dist/esm/execution/executor.js +46 -0
- package/dist/esm/execution/executor.js.map +1 -0
- package/dist/esm/execution/result-mapper.d.ts +26 -0
- package/dist/esm/execution/result-mapper.d.ts.map +1 -0
- package/dist/esm/execution/result-mapper.js +85 -0
- package/dist/esm/execution/result-mapper.js.map +1 -0
- package/dist/esm/generator/generate-types.d.ts +55 -0
- package/dist/esm/generator/generate-types.d.ts.map +1 -0
- package/dist/esm/generator/generate-types.js +141 -0
- package/dist/esm/generator/generate-types.js.map +1 -0
- package/dist/esm/generator/index.d.ts +3 -0
- package/dist/esm/generator/index.d.ts.map +1 -0
- package/dist/esm/generator/index.js +2 -0
- package/dist/esm/generator/index.js.map +1 -0
- package/dist/esm/generator/type-emitters/aggregation-emitter.d.ts +7 -0
- package/dist/esm/generator/type-emitters/aggregation-emitter.d.ts.map +1 -0
- package/dist/esm/generator/type-emitters/aggregation-emitter.js +193 -0
- package/dist/esm/generator/type-emitters/aggregation-emitter.js.map +1 -0
- package/dist/esm/generator/type-emitters/connection-emitter.d.ts +22 -0
- package/dist/esm/generator/type-emitters/connection-emitter.d.ts.map +1 -0
- package/dist/esm/generator/type-emitters/connection-emitter.js +266 -0
- package/dist/esm/generator/type-emitters/connection-emitter.js.map +1 -0
- package/dist/esm/generator/type-emitters/enum-emitter.d.ts +7 -0
- package/dist/esm/generator/type-emitters/enum-emitter.d.ts.map +1 -0
- package/dist/esm/generator/type-emitters/enum-emitter.js +42 -0
- package/dist/esm/generator/type-emitters/enum-emitter.js.map +1 -0
- package/dist/esm/generator/type-emitters/fulltext-emitter.d.ts +15 -0
- package/dist/esm/generator/type-emitters/fulltext-emitter.d.ts.map +1 -0
- package/dist/esm/generator/type-emitters/fulltext-emitter.js +77 -0
- package/dist/esm/generator/type-emitters/fulltext-emitter.js.map +1 -0
- package/dist/esm/generator/type-emitters/helpers.d.ts +32 -0
- package/dist/esm/generator/type-emitters/helpers.d.ts.map +1 -0
- package/dist/esm/generator/type-emitters/helpers.js +63 -0
- package/dist/esm/generator/type-emitters/helpers.js.map +1 -0
- package/dist/esm/generator/type-emitters/input-emitter.d.ts +6 -0
- package/dist/esm/generator/type-emitters/input-emitter.d.ts.map +1 -0
- package/dist/esm/generator/type-emitters/input-emitter.js +557 -0
- package/dist/esm/generator/type-emitters/input-emitter.js.map +1 -0
- package/dist/esm/generator/type-emitters/interface-emitter.d.ts +10 -0
- package/dist/esm/generator/type-emitters/interface-emitter.d.ts.map +1 -0
- package/dist/esm/generator/type-emitters/interface-emitter.js +85 -0
- package/dist/esm/generator/type-emitters/interface-emitter.js.map +1 -0
- package/dist/esm/generator/type-emitters/model-map-emitter.d.ts +32 -0
- package/dist/esm/generator/type-emitters/model-map-emitter.d.ts.map +1 -0
- package/dist/esm/generator/type-emitters/model-map-emitter.js +149 -0
- package/dist/esm/generator/type-emitters/model-map-emitter.js.map +1 -0
- package/dist/esm/generator/type-emitters/mutation-response-emitter.d.ts +9 -0
- package/dist/esm/generator/type-emitters/mutation-response-emitter.d.ts.map +1 -0
- package/dist/esm/generator/type-emitters/mutation-response-emitter.js +66 -0
- package/dist/esm/generator/type-emitters/mutation-response-emitter.js.map +1 -0
- package/dist/esm/generator/type-emitters/node-type-emitter.d.ts +13 -0
- package/dist/esm/generator/type-emitters/node-type-emitter.d.ts.map +1 -0
- package/dist/esm/generator/type-emitters/node-type-emitter.js +120 -0
- package/dist/esm/generator/type-emitters/node-type-emitter.js.map +1 -0
- package/dist/esm/generator/type-emitters/select-fields-emitter.d.ts +8 -0
- package/dist/esm/generator/type-emitters/select-fields-emitter.d.ts.map +1 -0
- package/dist/esm/generator/type-emitters/select-fields-emitter.js +166 -0
- package/dist/esm/generator/type-emitters/select-fields-emitter.js.map +1 -0
- package/dist/esm/generator/type-emitters/select-result-emitter.d.ts +9 -0
- package/dist/esm/generator/type-emitters/select-result-emitter.d.ts.map +1 -0
- package/dist/esm/generator/type-emitters/select-result-emitter.js +58 -0
- package/dist/esm/generator/type-emitters/select-result-emitter.js.map +1 -0
- package/dist/esm/generator/type-emitters/sort-options-emitter.d.ts +8 -0
- package/dist/esm/generator/type-emitters/sort-options-emitter.d.ts.map +1 -0
- package/dist/esm/generator/type-emitters/sort-options-emitter.js +44 -0
- package/dist/esm/generator/type-emitters/sort-options-emitter.js.map +1 -0
- package/dist/esm/generator/type-emitters/utility-types.d.ts +10 -0
- package/dist/esm/generator/type-emitters/utility-types.d.ts.map +1 -0
- package/dist/esm/generator/type-emitters/utility-types.js +88 -0
- package/dist/esm/generator/type-emitters/utility-types.js.map +1 -0
- package/dist/esm/generator/type-emitters/where-emitter.d.ts +15 -0
- package/dist/esm/generator/type-emitters/where-emitter.d.ts.map +1 -0
- package/dist/esm/generator/type-emitters/where-emitter.js +186 -0
- package/dist/esm/generator/type-emitters/where-emitter.js.map +1 -0
- package/dist/esm/index.d.ts +30 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +29 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/interface-model.d.ts +158 -0
- package/dist/esm/interface-model.d.ts.map +1 -0
- package/dist/esm/interface-model.js +210 -0
- package/dist/esm/interface-model.js.map +1 -0
- package/dist/esm/model.d.ts +354 -0
- package/dist/esm/model.d.ts.map +1 -0
- package/dist/esm/model.js +507 -0
- package/dist/esm/model.js.map +1 -0
- package/dist/esm/ogm.d.ts +97 -0
- package/dist/esm/ogm.d.ts.map +1 -0
- package/dist/esm/ogm.js +220 -0
- package/dist/esm/ogm.js.map +1 -0
- package/dist/esm/package.json +1 -0
- package/dist/esm/schema/parser.d.ts +12 -0
- package/dist/esm/schema/parser.d.ts.map +1 -0
- package/dist/esm/schema/parser.js +324 -0
- package/dist/esm/schema/parser.js.map +1 -0
- package/dist/esm/schema/types.d.ts +66 -0
- package/dist/esm/schema/types.d.ts.map +1 -0
- package/dist/esm/schema/types.js +2 -0
- package/dist/esm/schema/types.js.map +1 -0
- package/dist/esm/schema/utils.d.ts +23 -0
- package/dist/esm/schema/utils.d.ts.map +1 -0
- package/dist/esm/schema/utils.js +87 -0
- package/dist/esm/schema/utils.js.map +1 -0
- package/dist/esm/subgraph/index.d.ts +3 -0
- package/dist/esm/subgraph/index.d.ts.map +1 -0
- package/dist/esm/subgraph/index.js +2 -0
- package/dist/esm/subgraph/index.js.map +1 -0
- package/dist/esm/subgraph/subgraph-operations.d.ts +34 -0
- package/dist/esm/subgraph/subgraph-operations.d.ts.map +1 -0
- package/dist/esm/subgraph/subgraph-operations.js +221 -0
- package/dist/esm/subgraph/subgraph-operations.js.map +1 -0
- package/dist/esm/subgraph/types.d.ts +23 -0
- package/dist/esm/subgraph/types.d.ts.map +1 -0
- package/dist/esm/subgraph/types.js +2 -0
- package/dist/esm/subgraph/types.js.map +1 -0
- package/dist/esm/testing/cypher-assert.d.ts +35 -0
- package/dist/esm/testing/cypher-assert.d.ts.map +1 -0
- package/dist/esm/testing/cypher-assert.js +68 -0
- package/dist/esm/testing/cypher-assert.js.map +1 -0
- package/dist/esm/testing/index.d.ts +4 -0
- package/dist/esm/testing/index.d.ts.map +1 -0
- package/dist/esm/testing/index.js +4 -0
- package/dist/esm/testing/index.js.map +1 -0
- package/dist/esm/testing/neo4j-record-factory.d.ts +25 -0
- package/dist/esm/testing/neo4j-record-factory.d.ts.map +1 -0
- package/dist/esm/testing/neo4j-record-factory.js +36 -0
- package/dist/esm/testing/neo4j-record-factory.js.map +1 -0
- package/dist/esm/testing/selection-set-factory.d.ts +24 -0
- package/dist/esm/testing/selection-set-factory.d.ts.map +1 -0
- package/dist/esm/testing/selection-set-factory.js +40 -0
- package/dist/esm/testing/selection-set-factory.js.map +1 -0
- package/dist/esm/utils/lucene.d.ts +9 -0
- package/dist/esm/utils/lucene.d.ts.map +1 -0
- package/dist/esm/utils/lucene.js +22 -0
- package/dist/esm/utils/lucene.js.map +1 -0
- package/dist/esm/utils/validation.d.ts +25 -0
- package/dist/esm/utils/validation.d.ts.map +1 -0
- package/dist/esm/utils/validation.js +46 -0
- package/dist/esm/utils/validation.js.map +1 -0
- package/package.json +88 -0
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/** Recursive type for Neo4j property values (no `any`) */
|
|
2
|
+
export type Neo4jValue = string | number | boolean | null | Neo4jValue[] | {
|
|
3
|
+
[key: string]: Neo4jValue;
|
|
4
|
+
};
|
|
5
|
+
/** Generic fallback types */
|
|
6
|
+
export interface WhereInput {
|
|
7
|
+
[key: string]: Neo4jValue | WhereInput | WhereInput[];
|
|
8
|
+
}
|
|
9
|
+
export interface MutationInput {
|
|
10
|
+
[key: string]: Neo4jValue | MutationInput | MutationInput[];
|
|
11
|
+
}
|
|
12
|
+
export interface PropertyDefinition {
|
|
13
|
+
name: string;
|
|
14
|
+
type: string;
|
|
15
|
+
required: boolean;
|
|
16
|
+
isArray: boolean;
|
|
17
|
+
isListItemRequired: boolean;
|
|
18
|
+
isGenerated: boolean;
|
|
19
|
+
isUnique: boolean;
|
|
20
|
+
isCypher: boolean;
|
|
21
|
+
directives: string[];
|
|
22
|
+
defaultValue?: string;
|
|
23
|
+
}
|
|
24
|
+
export interface RelationshipDefinition {
|
|
25
|
+
fieldName: string;
|
|
26
|
+
type: string;
|
|
27
|
+
direction: 'IN' | 'OUT';
|
|
28
|
+
target: string;
|
|
29
|
+
properties?: string;
|
|
30
|
+
isArray: boolean;
|
|
31
|
+
isRequired: boolean;
|
|
32
|
+
}
|
|
33
|
+
export interface FulltextIndex {
|
|
34
|
+
name: string;
|
|
35
|
+
fields: string[];
|
|
36
|
+
}
|
|
37
|
+
export interface NodeDefinition {
|
|
38
|
+
typeName: string;
|
|
39
|
+
label: string;
|
|
40
|
+
labels: string[];
|
|
41
|
+
pluralName: string;
|
|
42
|
+
properties: Map<string, PropertyDefinition>;
|
|
43
|
+
relationships: Map<string, RelationshipDefinition>;
|
|
44
|
+
fulltextIndexes: FulltextIndex[];
|
|
45
|
+
implementsInterfaces: string[];
|
|
46
|
+
}
|
|
47
|
+
export interface InterfaceDefinition {
|
|
48
|
+
name: string;
|
|
49
|
+
label: string;
|
|
50
|
+
properties: Map<string, PropertyDefinition>;
|
|
51
|
+
relationships: Map<string, RelationshipDefinition>;
|
|
52
|
+
implementedBy: string[];
|
|
53
|
+
}
|
|
54
|
+
export interface RelationshipPropertiesDefinition {
|
|
55
|
+
typeName: string;
|
|
56
|
+
properties: Map<string, PropertyDefinition>;
|
|
57
|
+
fulltextIndexes?: FulltextIndex[];
|
|
58
|
+
}
|
|
59
|
+
export interface SchemaMetadata {
|
|
60
|
+
nodes: Map<string, NodeDefinition>;
|
|
61
|
+
interfaces: Map<string, InterfaceDefinition>;
|
|
62
|
+
relationshipProperties: Map<string, RelationshipPropertiesDefinition>;
|
|
63
|
+
enums: Map<string, string[]>;
|
|
64
|
+
unions: Map<string, string[]>;
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/schema/types.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,MAAM,MAAM,UAAU,GAClB,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,UAAU,EAAE,GACZ;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,CAAA;CAAE,CAAC;AAElC,6BAA6B;AAC7B,MAAM,WAAW,UAAU;IACzB,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,EAAE,CAAC;CACvD;AACD,MAAM,WAAW,aAAa;IAC5B,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,aAAa,GAAG,aAAa,EAAE,CAAC;CAC7D;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,OAAO,CAAC;IACjB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,WAAW,EAAE,OAAO,CAAC;IACrB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,IAAI,GAAG,KAAK,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,OAAO,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC5C,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IACnD,eAAe,EAAE,aAAa,EAAE,CAAC;IACjC,oBAAoB,EAAE,MAAM,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC5C,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IACnD,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;IAC5C,eAAe,CAAC,EAAE,aAAa,EAAE,CAAC;CACnC;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACnC,UAAU,EAAE,GAAG,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAC7C,sBAAsB,EAAE,GAAG,CAAC,MAAM,EAAE,gCAAgC,CAAC,CAAC;IACtE,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7B,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CAC/B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/schema/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { NodeDefinition, SchemaMetadata } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Clear the module-level resolve cache.
|
|
4
|
+
* Useful in tests to prevent cross-test state pollution.
|
|
5
|
+
*/
|
|
6
|
+
export declare function clearResolveTargetDefCache(): void;
|
|
7
|
+
/**
|
|
8
|
+
* Resolve a target type name to a NodeDefinition, handling union targets
|
|
9
|
+
* by merging all member nodes' properties and relationships.
|
|
10
|
+
*
|
|
11
|
+
* Results are memoized per (schema identity + target) to avoid repeated
|
|
12
|
+
* O(members × properties) merges for the same union type.
|
|
13
|
+
*/
|
|
14
|
+
export declare function resolveTargetDef(target: string, schema: SchemaMetadata): NodeDefinition | null;
|
|
15
|
+
/**
|
|
16
|
+
* Compute the validated label string for a NodeDefinition.
|
|
17
|
+
* Deduplicates labels, validates each, and joins with ':'.
|
|
18
|
+
*
|
|
19
|
+
* Callers that need caching should maintain their own cache (e.g., per MutationCompiler instance)
|
|
20
|
+
* to avoid cross-test pollution from module-level state.
|
|
21
|
+
*/
|
|
22
|
+
export declare function getTargetLabelString(nodeDef: NodeDefinition): string;
|
|
23
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/schema/utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EAEd,cAAc,EACf,MAAM,SAAS,CAAC;AAUjB;;;GAGG;AACH,wBAAgB,0BAA0B,IAAI,IAAI,CAEjD;AAED;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,cAAc,GACrB,cAAc,GAAG,IAAI,CA0DvB;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,cAAc,GAAG,MAAM,CAKpE"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.clearResolveTargetDefCache = clearResolveTargetDefCache;
|
|
4
|
+
exports.resolveTargetDef = resolveTargetDef;
|
|
5
|
+
exports.getTargetLabelString = getTargetLabelString;
|
|
6
|
+
const validation_1 = require("../utils/validation");
|
|
7
|
+
/**
|
|
8
|
+
* Module-level cache for resolved union/interface target definitions.
|
|
9
|
+
* Bounded by the number of unique type names in the schema (~50-100 entries).
|
|
10
|
+
* Use `clearResolveTargetDefCache()` to reset (e.g., between tests).
|
|
11
|
+
*/
|
|
12
|
+
const resolveTargetDefCache = new Map();
|
|
13
|
+
/**
|
|
14
|
+
* Clear the module-level resolve cache.
|
|
15
|
+
* Useful in tests to prevent cross-test state pollution.
|
|
16
|
+
*/
|
|
17
|
+
function clearResolveTargetDefCache() {
|
|
18
|
+
resolveTargetDefCache.clear();
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Resolve a target type name to a NodeDefinition, handling union targets
|
|
22
|
+
* by merging all member nodes' properties and relationships.
|
|
23
|
+
*
|
|
24
|
+
* Results are memoized per (schema identity + target) to avoid repeated
|
|
25
|
+
* O(members × properties) merges for the same union type.
|
|
26
|
+
*/
|
|
27
|
+
function resolveTargetDef(target, schema) {
|
|
28
|
+
const direct = schema.nodes.get(target);
|
|
29
|
+
if (direct)
|
|
30
|
+
return direct;
|
|
31
|
+
const cached = resolveTargetDefCache.get(target);
|
|
32
|
+
if (cached !== undefined)
|
|
33
|
+
return cached;
|
|
34
|
+
// Check interfaces — build a NodeDefinition from the interface definition
|
|
35
|
+
const interfaceDef = schema.interfaces?.get(target);
|
|
36
|
+
if (interfaceDef) {
|
|
37
|
+
const result = {
|
|
38
|
+
typeName: interfaceDef.name,
|
|
39
|
+
label: interfaceDef.label,
|
|
40
|
+
labels: [interfaceDef.label],
|
|
41
|
+
pluralName: interfaceDef.name.toLowerCase() + 's',
|
|
42
|
+
properties: interfaceDef.properties,
|
|
43
|
+
relationships: interfaceDef.relationships,
|
|
44
|
+
fulltextIndexes: [],
|
|
45
|
+
implementsInterfaces: [],
|
|
46
|
+
};
|
|
47
|
+
resolveTargetDefCache.set(target, result);
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
const unionMembers = schema.unions?.get(target);
|
|
51
|
+
if (!unionMembers || unionMembers.length === 0) {
|
|
52
|
+
resolveTargetDefCache.set(target, null);
|
|
53
|
+
return null;
|
|
54
|
+
}
|
|
55
|
+
const mergedProperties = new Map();
|
|
56
|
+
const mergedRelationships = new Map();
|
|
57
|
+
for (const memberName of unionMembers) {
|
|
58
|
+
const memberDef = schema.nodes.get(memberName);
|
|
59
|
+
if (!memberDef)
|
|
60
|
+
continue;
|
|
61
|
+
for (const [k, v] of memberDef.properties)
|
|
62
|
+
if (!mergedProperties.has(k))
|
|
63
|
+
mergedProperties.set(k, v);
|
|
64
|
+
for (const [k, v] of memberDef.relationships)
|
|
65
|
+
if (!mergedRelationships.has(k))
|
|
66
|
+
mergedRelationships.set(k, v);
|
|
67
|
+
}
|
|
68
|
+
const result = {
|
|
69
|
+
typeName: target,
|
|
70
|
+
label: target,
|
|
71
|
+
labels: [target],
|
|
72
|
+
pluralName: target.toLowerCase() + 's',
|
|
73
|
+
properties: mergedProperties,
|
|
74
|
+
relationships: mergedRelationships,
|
|
75
|
+
fulltextIndexes: [],
|
|
76
|
+
implementsInterfaces: [],
|
|
77
|
+
};
|
|
78
|
+
resolveTargetDefCache.set(target, result);
|
|
79
|
+
return result;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Compute the validated label string for a NodeDefinition.
|
|
83
|
+
* Deduplicates labels, validates each, and joins with ':'.
|
|
84
|
+
*
|
|
85
|
+
* Callers that need caching should maintain their own cache (e.g., per MutationCompiler instance)
|
|
86
|
+
* to avoid cross-test pollution from module-level state.
|
|
87
|
+
*/
|
|
88
|
+
function getTargetLabelString(nodeDef) {
|
|
89
|
+
const allLabels = [...new Set([nodeDef.label, ...nodeDef.labels])].map((l) => (0, validation_1.assertSafeLabel)(l));
|
|
90
|
+
return allLabels.join(':');
|
|
91
|
+
}
|
|
92
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../src/schema/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/subgraph/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACtE,YAAY,EACV,mBAAmB,EACnB,cAAc,EACd,oBAAoB,EACpB,6BAA6B,GAC9B,MAAM,SAAS,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.deleteSubgraph = exports.cloneSubgraph = void 0;
|
|
4
|
+
var subgraph_operations_1 = require("./subgraph-operations");
|
|
5
|
+
Object.defineProperty(exports, "cloneSubgraph", { enumerable: true, get: function () { return subgraph_operations_1.cloneSubgraph; } });
|
|
6
|
+
Object.defineProperty(exports, "deleteSubgraph", { enumerable: true, get: function () { return subgraph_operations_1.deleteSubgraph; } });
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/subgraph/index.ts"],"names":[],"mappings":";;;AAAA,6DAAsE;AAA7D,oHAAA,aAAa,OAAA;AAAE,qHAAA,cAAc,OAAA"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { Transaction } from 'neo4j-driver';
|
|
2
|
+
import { OGMLogger } from '../execution/executor';
|
|
3
|
+
import { SubgraphCloneResult, SubgraphConfig, SubgraphDeleteResult } from './types';
|
|
4
|
+
/**
|
|
5
|
+
* Clones a content subgraph rooted at the given source node using APOC procedures.
|
|
6
|
+
*
|
|
7
|
+
* Phase 1: Collects the subgraph via `apoc.path.subgraphAll` and clones it
|
|
8
|
+
* with `apoc.refactor.cloneSubgraph`. Generates new UUIDs for all cloned nodes
|
|
9
|
+
* and sets `clonedFromId` on each clone pointing to the original.
|
|
10
|
+
*
|
|
11
|
+
* Phase 2: Re-attaches reference relationships from cloned nodes to shared/lookup nodes
|
|
12
|
+
* (e.g., Language, Status, MeasurementUnit) that were outside the clone scope.
|
|
13
|
+
*
|
|
14
|
+
* @param sourceRootId - The `id` property of the root node to clone
|
|
15
|
+
* @param config - Defines which nodes to clone vs reference
|
|
16
|
+
* @param transaction - Caller-managed Neo4j transaction
|
|
17
|
+
* @param logger - Optional logger for debug output
|
|
18
|
+
* @returns The cloned root node id and a mapping of original→cloned node ids
|
|
19
|
+
*/
|
|
20
|
+
export declare function cloneSubgraph(sourceRootId: string, config: SubgraphConfig, transaction: Transaction, logger?: OGMLogger): Promise<SubgraphCloneResult>;
|
|
21
|
+
/**
|
|
22
|
+
* Deletes a content subgraph rooted at the given node using APOC procedures.
|
|
23
|
+
*
|
|
24
|
+
* Uses `apoc.path.subgraphAll` to collect all owned nodes within the configured
|
|
25
|
+
* labels and relationships, then `DETACH DELETE`s them.
|
|
26
|
+
*
|
|
27
|
+
* @param rootId - The `id` property of the subgraph root node to delete
|
|
28
|
+
* @param config - Defines which labels/relationships form the owned subgraph
|
|
29
|
+
* @param transaction - Caller-managed Neo4j transaction
|
|
30
|
+
* @param logger - Optional logger for debug output
|
|
31
|
+
* @returns The count of deleted nodes
|
|
32
|
+
*/
|
|
33
|
+
export declare function deleteSubgraph(rootId: string, config: SubgraphConfig, transaction: Transaction, logger?: OGMLogger): Promise<SubgraphDeleteResult>;
|
|
34
|
+
//# sourceMappingURL=subgraph-operations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subgraph-operations.d.ts","sourceRoot":"","sources":["../../../src/subgraph/subgraph-operations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAE3C,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAMlD,OAAO,EACL,mBAAmB,EACnB,cAAc,EACd,oBAAoB,EACrB,MAAM,SAAS,CAAC;AA4BjB;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,aAAa,CACjC,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,cAAc,EACtB,WAAW,EAAE,WAAW,EACxB,MAAM,CAAC,EAAE,SAAS,GACjB,OAAO,CAAC,mBAAmB,CAAC,CA+B9B;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,cAAc,CAClC,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,cAAc,EACtB,WAAW,EAAE,WAAW,EACxB,MAAM,CAAC,EAAE,SAAS,GACjB,OAAO,CAAC,oBAAoB,CAAC,CAkD/B"}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.cloneSubgraph = cloneSubgraph;
|
|
4
|
+
exports.deleteSubgraph = deleteSubgraph;
|
|
5
|
+
const errors_1 = require("../errors");
|
|
6
|
+
const validation_1 = require("../utils/validation");
|
|
7
|
+
/** No-op logger used when no logger is provided. */
|
|
8
|
+
const NOOP_LOGGER = { debug: () => { } };
|
|
9
|
+
/**
|
|
10
|
+
* Validates all labels and relationship types in a SubgraphConfig
|
|
11
|
+
* to prevent Cypher injection (these values are string-interpolated).
|
|
12
|
+
*/
|
|
13
|
+
function validateConfig(config) {
|
|
14
|
+
for (const label of config.ownedLabels)
|
|
15
|
+
(0, validation_1.assertSafeLabel)(label);
|
|
16
|
+
for (const rel of config.ownedRelationships)
|
|
17
|
+
(0, validation_1.assertSafeIdentifier)(rel, 'owned relationship type');
|
|
18
|
+
for (const ref of config.referenceRelationships) {
|
|
19
|
+
(0, validation_1.assertSafeLabel)(ref.fromLabel);
|
|
20
|
+
(0, validation_1.assertSafeIdentifier)(ref.relationshipType, 'reference relationship type');
|
|
21
|
+
if (ref.direction !== 'OUT' && ref.direction !== 'IN')
|
|
22
|
+
throw new errors_1.SubgraphOperationError('clone', '', `Invalid direction "${ref.direction}" for reference relationship ${ref.relationshipType}`);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Clones a content subgraph rooted at the given source node using APOC procedures.
|
|
27
|
+
*
|
|
28
|
+
* Phase 1: Collects the subgraph via `apoc.path.subgraphAll` and clones it
|
|
29
|
+
* with `apoc.refactor.cloneSubgraph`. Generates new UUIDs for all cloned nodes
|
|
30
|
+
* and sets `clonedFromId` on each clone pointing to the original.
|
|
31
|
+
*
|
|
32
|
+
* Phase 2: Re-attaches reference relationships from cloned nodes to shared/lookup nodes
|
|
33
|
+
* (e.g., Language, Status, MeasurementUnit) that were outside the clone scope.
|
|
34
|
+
*
|
|
35
|
+
* @param sourceRootId - The `id` property of the root node to clone
|
|
36
|
+
* @param config - Defines which nodes to clone vs reference
|
|
37
|
+
* @param transaction - Caller-managed Neo4j transaction
|
|
38
|
+
* @param logger - Optional logger for debug output
|
|
39
|
+
* @returns The cloned root node id and a mapping of original→cloned node ids
|
|
40
|
+
*/
|
|
41
|
+
async function cloneSubgraph(sourceRootId, config, transaction, logger) {
|
|
42
|
+
const log = logger ?? NOOP_LOGGER;
|
|
43
|
+
validateConfig(config);
|
|
44
|
+
try {
|
|
45
|
+
const cloneResult = await executeApocClone(sourceRootId, config, transaction, log);
|
|
46
|
+
log.debug('[OGM $cloneSubgraph] Cloned %d nodes from root %s', cloneResult.nodeMapping.size, sourceRootId);
|
|
47
|
+
await reattachReferenceRelationships(config, cloneResult, transaction, log);
|
|
48
|
+
return cloneResult;
|
|
49
|
+
}
|
|
50
|
+
catch (error) {
|
|
51
|
+
if (error instanceof errors_1.SubgraphOperationError)
|
|
52
|
+
throw error;
|
|
53
|
+
throw new errors_1.SubgraphOperationError('clone', sourceRootId, error instanceof Error ? error.message : String(error), error instanceof Error ? error : undefined);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Deletes a content subgraph rooted at the given node using APOC procedures.
|
|
58
|
+
*
|
|
59
|
+
* Uses `apoc.path.subgraphAll` to collect all owned nodes within the configured
|
|
60
|
+
* labels and relationships, then `DETACH DELETE`s them.
|
|
61
|
+
*
|
|
62
|
+
* @param rootId - The `id` property of the subgraph root node to delete
|
|
63
|
+
* @param config - Defines which labels/relationships form the owned subgraph
|
|
64
|
+
* @param transaction - Caller-managed Neo4j transaction
|
|
65
|
+
* @param logger - Optional logger for debug output
|
|
66
|
+
* @returns The count of deleted nodes
|
|
67
|
+
*/
|
|
68
|
+
async function deleteSubgraph(rootId, config, transaction, logger) {
|
|
69
|
+
const log = logger ?? NOOP_LOGGER;
|
|
70
|
+
validateConfig(config);
|
|
71
|
+
const relFilter = config.ownedRelationships.join('|');
|
|
72
|
+
const labelFilter = config.ownedLabels.map((l) => `+${l}`).join('|');
|
|
73
|
+
try {
|
|
74
|
+
const result = await transaction.run(`
|
|
75
|
+
MATCH (source {id: $rootId})
|
|
76
|
+
CALL apoc.path.subgraphAll(source, {
|
|
77
|
+
relationshipFilter: $relFilter,
|
|
78
|
+
labelFilter: $labelFilter,
|
|
79
|
+
maxLevel: $maxLevel
|
|
80
|
+
}) YIELD nodes
|
|
81
|
+
UNWIND nodes AS n
|
|
82
|
+
DETACH DELETE n
|
|
83
|
+
RETURN count(*) AS deletedCount
|
|
84
|
+
`, {
|
|
85
|
+
rootId,
|
|
86
|
+
relFilter,
|
|
87
|
+
labelFilter,
|
|
88
|
+
maxLevel: config.maxLevel,
|
|
89
|
+
});
|
|
90
|
+
const deletedCount = result.records[0]?.get('deletedCount')?.toNumber?.() ??
|
|
91
|
+
result.records[0]?.get('deletedCount') ??
|
|
92
|
+
0;
|
|
93
|
+
log.debug('[OGM $deleteSubgraph] Deleted %d nodes from root %s', deletedCount, rootId);
|
|
94
|
+
return { deletedCount };
|
|
95
|
+
}
|
|
96
|
+
catch (error) {
|
|
97
|
+
if (error instanceof errors_1.SubgraphOperationError)
|
|
98
|
+
throw error;
|
|
99
|
+
throw new errors_1.SubgraphOperationError('delete', rootId, error instanceof Error ? error.message : String(error), error instanceof Error ? error : undefined);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Executes the APOC subgraph clone and generates new UUIDs for cloned nodes.
|
|
104
|
+
*/
|
|
105
|
+
async function executeApocClone(sourceRootId, config, transaction, logger) {
|
|
106
|
+
const relFilter = config.ownedRelationships.join('|');
|
|
107
|
+
const labelFilter = config.ownedLabels.map((l) => `+${l}`).join('|');
|
|
108
|
+
// Step 1: Collect subgraph and clone it
|
|
109
|
+
// APOC cloneSubgraph returns: input=INTEGER (original internal ID), output=NODE (clone).
|
|
110
|
+
// skipProperties: ['id'] avoids unique constraint violations during clone.
|
|
111
|
+
// We use `input` (internal ID) to match back to the original's app-level id.
|
|
112
|
+
const result = await transaction.run(`
|
|
113
|
+
MATCH (source {id: $sourceId})
|
|
114
|
+
CALL apoc.path.subgraphAll(source, {
|
|
115
|
+
relationshipFilter: $relFilter,
|
|
116
|
+
labelFilter: $labelFilter,
|
|
117
|
+
maxLevel: $maxLevel
|
|
118
|
+
}) YIELD nodes, relationships
|
|
119
|
+
CALL apoc.refactor.cloneSubgraph(nodes, relationships, {skipProperties: ['id']})
|
|
120
|
+
YIELD input, output, error
|
|
121
|
+
WHERE output IS NOT NULL
|
|
122
|
+
WITH input, output
|
|
123
|
+
MATCH (original) WHERE id(original) = input
|
|
124
|
+
SET output.clonedFromId = original.id
|
|
125
|
+
RETURN original.id AS originalId, elementId(output) AS cloneElementId
|
|
126
|
+
`, {
|
|
127
|
+
sourceId: sourceRootId,
|
|
128
|
+
relFilter,
|
|
129
|
+
labelFilter,
|
|
130
|
+
maxLevel: config.maxLevel,
|
|
131
|
+
});
|
|
132
|
+
// Build nodeMapping from result records
|
|
133
|
+
const nodeMapping = new Map();
|
|
134
|
+
let clonedRootElementId;
|
|
135
|
+
for (const record of result.records) {
|
|
136
|
+
const originalId = record.get('originalId');
|
|
137
|
+
const cloneElementId = record.get('cloneElementId');
|
|
138
|
+
nodeMapping.set(originalId, cloneElementId);
|
|
139
|
+
if (originalId === sourceRootId)
|
|
140
|
+
clonedRootElementId = cloneElementId;
|
|
141
|
+
}
|
|
142
|
+
if (!clonedRootElementId)
|
|
143
|
+
throw new errors_1.SubgraphOperationError('clone', sourceRootId, 'Clone did not produce a root node');
|
|
144
|
+
// Step 2: Generate new UUIDs for cloned nodes
|
|
145
|
+
// clonedFromId was already set in Step 1 via the APOC clone query
|
|
146
|
+
const uuidResult = await transaction.run(`
|
|
147
|
+
UNWIND $elementIds AS elemId
|
|
148
|
+
MATCH (n) WHERE elementId(n) = elemId
|
|
149
|
+
WITH n, elementId(n) AS elemId, randomUUID() AS newId
|
|
150
|
+
SET n.id = newId
|
|
151
|
+
RETURN elemId, newId
|
|
152
|
+
`, {
|
|
153
|
+
elementIds: Array.from(nodeMapping.values()),
|
|
154
|
+
});
|
|
155
|
+
// Rebuild mapping with new UUIDs: originalId → newUUID
|
|
156
|
+
const elementIdToNewUuid = new Map();
|
|
157
|
+
for (const record of uuidResult.records)
|
|
158
|
+
elementIdToNewUuid.set(record.get('elemId'), record.get('newId'));
|
|
159
|
+
const finalMapping = new Map();
|
|
160
|
+
for (const [originalId, elementId] of nodeMapping) {
|
|
161
|
+
const newUuid = elementIdToNewUuid.get(elementId);
|
|
162
|
+
if (newUuid)
|
|
163
|
+
finalMapping.set(originalId, newUuid);
|
|
164
|
+
}
|
|
165
|
+
const finalClonedRootId = elementIdToNewUuid.get(clonedRootElementId);
|
|
166
|
+
if (!finalClonedRootId)
|
|
167
|
+
throw new errors_1.SubgraphOperationError('clone', sourceRootId, 'Failed to assign new UUID to cloned root node');
|
|
168
|
+
logger.debug('[OGM $cloneSubgraph] APOC clone complete: %d nodes, root %s → %s', finalMapping.size, sourceRootId, finalClonedRootId);
|
|
169
|
+
return {
|
|
170
|
+
clonedRootId: finalClonedRootId,
|
|
171
|
+
nodeMapping: finalMapping,
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Re-attaches reference relationships from cloned nodes to shared/lookup nodes.
|
|
176
|
+
*
|
|
177
|
+
* After APOC cloning, cloned nodes lose their relationships to shared nodes
|
|
178
|
+
* (e.g., Language, Status, MeasurementUnit) because those were outside the clone scope.
|
|
179
|
+
* This queries the original nodes for their reference relationships and re-creates
|
|
180
|
+
* them on the cloned nodes.
|
|
181
|
+
*
|
|
182
|
+
* NOTE: `properties(r)` is materialized into a map variable (`relProps`) BEFORE
|
|
183
|
+
* the CREATE to ensure relationship properties are preserved. Accessing
|
|
184
|
+
* `properties(r)` after a WITH boundary inside CALL {} can silently return
|
|
185
|
+
* an empty map in some Neo4j versions.
|
|
186
|
+
*/
|
|
187
|
+
async function reattachReferenceRelationships(config, cloneResult, transaction, logger) {
|
|
188
|
+
if (!config.referenceRelationships.length)
|
|
189
|
+
return;
|
|
190
|
+
const mappings = Array.from(cloneResult.nodeMapping.entries()).map(([originalId, cloneId]) => ({ originalId, cloneId }));
|
|
191
|
+
for (const refRel of config.referenceRelationships) {
|
|
192
|
+
const escapedRelType = (0, validation_1.escapeIdentifier)(refRel.relationshipType);
|
|
193
|
+
const escapedLabel = (0, validation_1.assertSafeLabel)(refRel.fromLabel);
|
|
194
|
+
const matchPattern = refRel.direction === 'OUT'
|
|
195
|
+
? `-[r:${escapedRelType}]->(target)`
|
|
196
|
+
: `<-[r:${escapedRelType}]-(target)`;
|
|
197
|
+
const createPattern = refRel.direction === 'OUT'
|
|
198
|
+
? `CREATE (clone)-[newR:${escapedRelType}]->(target)`
|
|
199
|
+
: `CREATE (clone)<-[newR:${escapedRelType}]-(target)`;
|
|
200
|
+
const result = await transaction.run(`
|
|
201
|
+
UNWIND $mappings AS mapping
|
|
202
|
+
MATCH (original {id: mapping.originalId})
|
|
203
|
+
WHERE original:${escapedLabel}
|
|
204
|
+
MATCH (clone {id: mapping.cloneId})
|
|
205
|
+
WHERE clone:${escapedLabel}
|
|
206
|
+
WITH original, clone
|
|
207
|
+
CALL {
|
|
208
|
+
WITH original, clone
|
|
209
|
+
MATCH (original)${matchPattern}
|
|
210
|
+
WITH clone, target, properties(r) AS relProps
|
|
211
|
+
${createPattern}
|
|
212
|
+
SET newR = relProps
|
|
213
|
+
RETURN count(*) AS created
|
|
214
|
+
}
|
|
215
|
+
RETURN sum(created) AS totalCreated
|
|
216
|
+
`, { mappings });
|
|
217
|
+
const totalCreated = result.records[0]?.get('totalCreated')?.toNumber?.() ??
|
|
218
|
+
result.records[0]?.get('totalCreated') ??
|
|
219
|
+
0;
|
|
220
|
+
if (totalCreated > 0)
|
|
221
|
+
logger.debug('[OGM $cloneSubgraph] Reattached %d %s relationships (%s)', totalCreated, refRel.relationshipType, refRel.fromLabel);
|
|
222
|
+
}
|
|
223
|
+
logger.debug('[OGM $cloneSubgraph] Reattached %d reference relationship types', config.referenceRelationships.length);
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=subgraph-operations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"subgraph-operations.js","sourceRoot":"","sources":["../../../src/subgraph/subgraph-operations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/** Reference relationship from a cloned node to a shared/lookup node. */
|
|
2
|
+
export interface SubgraphReferenceRelationship {
|
|
3
|
+
fromLabel: string;
|
|
4
|
+
relationshipType: string;
|
|
5
|
+
direction: 'OUT' | 'IN';
|
|
6
|
+
}
|
|
7
|
+
/** Configuration for clone/delete operations — domain-agnostic blueprint. */
|
|
8
|
+
export interface SubgraphConfig {
|
|
9
|
+
ownedLabels: string[];
|
|
10
|
+
ownedRelationships: string[];
|
|
11
|
+
maxLevel: number;
|
|
12
|
+
referenceRelationships: SubgraphReferenceRelationship[];
|
|
13
|
+
}
|
|
14
|
+
/** Clone result. */
|
|
15
|
+
export interface SubgraphCloneResult {
|
|
16
|
+
clonedRootId: string;
|
|
17
|
+
nodeMapping: Map<string, string>;
|
|
18
|
+
}
|
|
19
|
+
/** Delete result. */
|
|
20
|
+
export interface SubgraphDeleteResult {
|
|
21
|
+
deletedCount: number;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/subgraph/types.ts"],"names":[],"mappings":"AAAA,yEAAyE;AACzE,MAAM,WAAW,6BAA6B;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,KAAK,GAAG,IAAI,CAAC;CACzB;AAED,6EAA6E;AAC7E,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,sBAAsB,EAAE,6BAA6B,EAAE,CAAC;CACzD;AAED,oBAAoB;AACpB,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,qBAAqB;AACrB,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,MAAM,CAAC;CACtB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/subgraph/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Structural Cypher comparison utility that normalizes whitespace
|
|
3
|
+
* and parameter names for deterministic test assertions.
|
|
4
|
+
*/
|
|
5
|
+
export declare class CypherAssert {
|
|
6
|
+
/**
|
|
7
|
+
* Normalize a Cypher string for structural comparison:
|
|
8
|
+
* - Collapse all whitespace sequences to a single space
|
|
9
|
+
* - Trim leading/trailing whitespace
|
|
10
|
+
* - Rename params to canonical $p0, $p1, etc. (in order of appearance)
|
|
11
|
+
*/
|
|
12
|
+
static normalize(cypher: string): string;
|
|
13
|
+
/**
|
|
14
|
+
* Assert two Cypher strings are structurally equal after normalization.
|
|
15
|
+
* Throws an Error if they differ.
|
|
16
|
+
*/
|
|
17
|
+
static assertStructurallyEqual(actual: string, expected: string): void;
|
|
18
|
+
/**
|
|
19
|
+
* Assert that a Cypher string contains a specific clause.
|
|
20
|
+
* @param cypher - The full Cypher string
|
|
21
|
+
* @param clauseType - e.g., 'WHERE', 'MATCH', 'RETURN', 'SET'
|
|
22
|
+
* @param pattern - Substring to search for within the clause
|
|
23
|
+
*/
|
|
24
|
+
static assertContainsClause(cypher: string, clauseType: string, pattern: string): void;
|
|
25
|
+
/**
|
|
26
|
+
* Assert that a Cypher string does NOT contain a specific clause/pattern.
|
|
27
|
+
*/
|
|
28
|
+
static assertNotContainsClause(cypher: string, clauseTypeOrPattern: string, pattern?: string): void;
|
|
29
|
+
/**
|
|
30
|
+
* Assert parameter values match expected.
|
|
31
|
+
* Only checks the keys present in expected (doesn't require exact match on all params).
|
|
32
|
+
*/
|
|
33
|
+
static assertParams(actual: Record<string, unknown>, expected: Record<string, unknown>): void;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=cypher-assert.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cypher-assert.d.ts","sourceRoot":"","sources":["../../../src/testing/cypher-assert.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,qBAAa,YAAY;IACvB;;;;;OAKG;IACH,MAAM,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;IAkBxC;;;OAGG;IACH,MAAM,CAAC,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IAStE;;;;;OAKG;IACH,MAAM,CAAC,oBAAoB,CACzB,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,OAAO,EAAE,MAAM,GACd,IAAI;IAYP;;OAEG;IACH,MAAM,CAAC,uBAAuB,CAC5B,MAAM,EAAE,MAAM,EACd,mBAAmB,EAAE,MAAM,EAC3B,OAAO,CAAC,EAAE,MAAM,GACf,IAAI;IAQP;;;OAGG;IACH,MAAM,CAAC,YAAY,CACjB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,IAAI;CAeR"}
|