From e9db5ffe0de55ea31c043a347c18ef0b1bc4779d Mon Sep 17 00:00:00 2001 From: Jorge Zaccaro Date: Fri, 10 Jul 2020 18:03:18 -0500 Subject: [PATCH 1/2] fix(neo4j): replace optional match with list comprehension --- .../neo4j/queries/spendTransactionOutputs.js | 26 +++++++++++-------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/lib/database/neo4j/queries/spendTransactionOutputs.js b/lib/database/neo4j/queries/spendTransactionOutputs.js index 2989fdc..d860778 100644 --- a/lib/database/neo4j/queries/spendTransactionOutputs.js +++ b/lib/database/neo4j/queries/spendTransactionOutputs.js @@ -1,7 +1,8 @@ 'use strict' const uglifyQueryString = require('../utils/uglifyQueryString') - +// merge (countspace)-[:Addresses]->(address:Address {id: thisOutput.address}) +// set source.LOCKED = true const query = ` unwind $countspaces as params merge (countspace:Countspace {id: params.symbol}) @@ -10,20 +11,23 @@ const query = ` where address.id = thisOutput.address set address.writeLock = timestamp() with *, thisOutput.sources + [''] as pointers unwind [pointer in pointers | split(pointer, '::')] as pointer - optional match (address)-[output:Outputs]->(source:Transaction) - where source.id = pointer[0] and output.id = toInteger(pointer[1]) - and not (source)<-[:Sources {id: output.id}]-(:Transaction) set source.LOCKED = true - with countspace, params, collect(distinct source) as sources, - reduce(pointers = [], pointer in [output in params.outputs | - output.sources] | pointers + pointer) as reducedPointers, - collect(distinct source.id + '::' + output.id) as pointers + with *, [ + (address)-[output:Outputs]->(source:Transaction) + where source.id = pointer[0] and output.id = toInteger(pointer[1]) + and not (source)<-[:Sources {id: output.id}]-(:Transaction) + | {node: source, pointer: source.id + '::' + output.id} + ] as _sources + with countspace, params, reduce(S = [], s in collect(_sources) | S + s) as sources, + reduce(P = [], p in [output in params.outputs | output.sources] | P + p) as paramsPointers + with *, [source in sources | source.node] as sourceNodes, + [source in sources | source.pointer] as sourcePointers create (transaction:Transaction {id: $id, time: timestamp()}) - foreach (_ in case when size(pointers)=size(reducedPointers) then [1] else [] end | + foreach (_ in case when size(sourcePointers)=size(paramsPointers) then [1] else [] end | foreach (input in params.inputs | merge (transaction)-[:Inputs]->(:IOU {id: input.hash})) foreach (output in params.outputs | foreach (pointer in [source in output.sources | split(source, '::')] | - foreach (funding in [source in sources where pointer[0] = source.id] | + foreach (funding in [source in sourceNodes where pointer[0] = source.id] | merge (transaction)-[:Sources {id: toInteger(pointer[1])}]->(funding))) ) foreach (output in params.outputs | @@ -32,7 +36,7 @@ const query = ` ) ) - foreach (source in sources | remove source.LOCKED) + foreach (source in sources | remove source.node.LOCKED) with transaction, transaction.id as id, countspace.id as symbol, params, [(transaction)-[input:Inputs]->(iou) | iou.id] as inputs, [(transaction)-[source:Sources]->(funding) | funding.id + '::' + source.id] as sources, From 3139620071433f3f1f57db98b699a97e24bd610e Mon Sep 17 00:00:00 2001 From: Jorge Zaccaro Date: Thu, 24 Sep 2020 09:36:07 -0500 Subject: [PATCH 2/2] refactor: create and match :Unspent outputs --- .../neo4j/queries/spendTransactionOutputs.js | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/lib/database/neo4j/queries/spendTransactionOutputs.js b/lib/database/neo4j/queries/spendTransactionOutputs.js index d860778..085f924 100644 --- a/lib/database/neo4j/queries/spendTransactionOutputs.js +++ b/lib/database/neo4j/queries/spendTransactionOutputs.js @@ -1,8 +1,7 @@ 'use strict' const uglifyQueryString = require('../utils/uglifyQueryString') -// merge (countspace)-[:Addresses]->(address:Address {id: thisOutput.address}) -// set source.LOCKED = true + const query = ` unwind $countspaces as params merge (countspace:Countspace {id: params.symbol}) @@ -12,19 +11,20 @@ const query = ` with *, thisOutput.sources + [''] as pointers unwind [pointer in pointers | split(pointer, '::')] as pointer with *, [ - (address)-[output:Outputs]->(source:Transaction) + (address)-[output:Unspent]->(source:Transaction) where source.id = pointer[0] and output.id = toInteger(pointer[1]) and not (source)<-[:Sources {id: output.id}]-(:Transaction) - | {node: source, pointer: source.id + '::' + output.id} + | {node: source, unspent: output} ] as _sources with countspace, params, reduce(S = [], s in collect(_sources) | S + s) as sources, reduce(P = [], p in [output in params.outputs | output.sources] | P + p) as paramsPointers with *, [source in sources | source.node] as sourceNodes, - [source in sources | source.pointer] as sourcePointers + [source in sources | source.unspent] as unspentOutputs create (transaction:Transaction {id: $id, time: timestamp()}) - foreach (_ in case when size(sourcePointers)=size(paramsPointers) then [1] else [] end | + foreach (_ in case when size(unspentOutputs)=size(paramsPointers) then [1] else [] end | foreach (input in params.inputs | merge (transaction)-[:Inputs]->(:IOU {id: input.hash})) + foreach (unspent in unspentOutputs | delete unspent) foreach (output in params.outputs | foreach (pointer in [source in output.sources | split(source, '::')] | foreach (funding in [source in sourceNodes where pointer[0] = source.id] | @@ -33,6 +33,7 @@ const query = ` foreach (output in params.outputs | merge (countspace)-[:Addresses]->(address:Address {id: output.address}) merge (address)-[:Outputs {id: toInteger(output.index)}]->(transaction) + merge (address)-[:Unspent {id: toInteger(output.index)}]->(transaction) ) ) @@ -40,7 +41,7 @@ const query = ` with transaction, transaction.id as id, countspace.id as symbol, params, [(transaction)-[input:Inputs]->(iou) | iou.id] as inputs, [(transaction)-[source:Sources]->(funding) | funding.id + '::' + source.id] as sources, - [(transaction)<-[output:Outputs]-(address) | address.id + '::' + output.id] as newputs + [(transaction)<-[output:Unspent]-(address) | address.id + '::' + output.id] as newputs return id, symbol, inputs, sources, [output in params.outputs where (output.address + '::' + toInteger(output.index)) in newputs | output] as outputs `