From d5b7beb0e230a78788815b61a7921059f08a7329 Mon Sep 17 00:00:00 2001 From: Nick Saukin Date: Thu, 29 May 2025 11:20:57 +0200 Subject: [PATCH 01/14] Draft execute_query --- jruby/neo4j/driver/ext/internal_driver.rb | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/jruby/neo4j/driver/ext/internal_driver.rb b/jruby/neo4j/driver/ext/internal_driver.rb index eadcfdf7..c3f7a4e5 100644 --- a/jruby/neo4j/driver/ext/internal_driver.rb +++ b/jruby/neo4j/driver/ext/internal_driver.rb @@ -11,6 +11,19 @@ module InternalDriver auto_closable :session + def execute_query(query, auth_token = nil, config = {}, **parameters) + java_method(:executableQuery, [java.lang.String]) + .call(query) + .java_method(:withParameters, [java.util.Map]) + .call(parameters) + .java_method(:withAuthToken, [org.neo4j.driver.AuthToken]) + .call(auth_token) + .java_method(:withConfig, [org.neo4j.driver.QueryConfig]) + .call(to_java_config(Neo4j::Driver::QueryConfig, **config)) + .java_method(:execute, []) + .call + end + def session(**session_config) java_method(:session, [org.neo4j.driver.SessionConfig]) .call(to_java_config(Neo4j::Driver::SessionConfig, **session_config)) From 3bb25dc7fb2c001c8ca836588b6c9adf90b2cbb1 Mon Sep 17 00:00:00 2001 From: Nick Saukin Date: Mon, 2 Jun 2025 17:51:09 +0200 Subject: [PATCH 02/14] Fix todo examples --- docs/dev_manual_todo_examples.rb | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/dev_manual_todo_examples.rb b/docs/dev_manual_todo_examples.rb index 511a96a6..e6220e13 100644 --- a/docs/dev_manual_todo_examples.rb +++ b/docs/dev_manual_todo_examples.rb @@ -26,7 +26,7 @@ # Create two nodes and a relationship result = driver.execute_query( 'CREATE (a:Person {name: $name}) - CREATE (b:Person {friend: $name}) + CREATE (b:Person {name: $friend}) CREATE (a)-[:KNOWS]->(b)', name: 'Alice', friend: 'David' @@ -104,6 +104,7 @@ # Database selection driver.execute_query( 'MATCH (p:Person) RETURN p.name', + nil, { database: 'neo4j' }, age: 42 ) @@ -157,7 +158,7 @@ puts notifications # Notifications with GQL status codes -result = execute_query( +result = driver.execute_query( "MATCH p=shortestPath((:Person {name: $start})-[*]->(:Person {name: $end})) RETURN p", start: 'Alice', From 751f7c8d5ced1ced4c8a00a85104e573569480ae Mon Sep 17 00:00:00 2001 From: Nick Saukin Date: Mon, 2 Jun 2025 17:52:02 +0200 Subject: [PATCH 03/14] Fix parameters in execute_query --- jruby/neo4j/driver/ext/internal_driver.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jruby/neo4j/driver/ext/internal_driver.rb b/jruby/neo4j/driver/ext/internal_driver.rb index c3f7a4e5..59635310 100644 --- a/jruby/neo4j/driver/ext/internal_driver.rb +++ b/jruby/neo4j/driver/ext/internal_driver.rb @@ -15,7 +15,7 @@ def execute_query(query, auth_token = nil, config = {}, **parameters) java_method(:executableQuery, [java.lang.String]) .call(query) .java_method(:withParameters, [java.util.Map]) - .call(parameters) + .call(parameters.transform_keys(&:to_s)) .java_method(:withAuthToken, [org.neo4j.driver.AuthToken]) .call(auth_token) .java_method(:withConfig, [org.neo4j.driver.QueryConfig]) From a9437f4729eb3fcafc1fbe27cf01e149d2424264 Mon Sep 17 00:00:00 2001 From: Nick Saukin Date: Mon, 2 Jun 2025 18:27:38 +0200 Subject: [PATCH 04/14] Fix todo examples --- docs/dev_manual_todo_examples.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/dev_manual_todo_examples.rb b/docs/dev_manual_todo_examples.rb index e6220e13..2dd4ef6c 100644 --- a/docs/dev_manual_todo_examples.rb +++ b/docs/dev_manual_todo_examples.rb @@ -4,8 +4,8 @@ result = driver.execute_query( 'MATCH (p:Person {age: $age}) RETURN p.name AS name', - nil, # auth_token not specified - nil may be omitted - { database: 'neo4j' }, # default value may be omitted + nil, # auth_token - positional argument can't be omitted when config is provided + { database: 'neo4j' }, # config - default value may be omitted age: 42 ) From 5233b88a8e841d42e7e02d6417a607642e0abe4d Mon Sep 17 00:00:00 2001 From: Nick Saukin Date: Mon, 2 Jun 2025 18:28:17 +0200 Subject: [PATCH 05/14] Add spec --- spec/neo4j/driver/execute_query_spec.rb | 157 ++++++++++++++++++++++++ 1 file changed, 157 insertions(+) create mode 100644 spec/neo4j/driver/execute_query_spec.rb diff --git a/spec/neo4j/driver/execute_query_spec.rb b/spec/neo4j/driver/execute_query_spec.rb new file mode 100644 index 00000000..9b9984ac --- /dev/null +++ b/spec/neo4j/driver/execute_query_spec.rb @@ -0,0 +1,157 @@ +# frozen_string_literal: true + +RSpec.describe Neo4j::Driver do + + describe '#execute_query' do + context 'when querying the database' do + it 'accepts query with default auth_token, config hash and parameters' do + expect { + driver.execute_query( + 'MATCH (p:Person {age: $age}) RETURN p.name AS name', + nil, + { database: 'neo4j' }, + age: 42 + ) + }.not_to raise_error + end + end + + context 'when writing to the database' do + it 'accepts query with only keyword parameters' do + expect { + driver.execute_query( + 'CREATE (a:Person {name: $name}) CREATE (b:Person {name: $friend}) CREATE (a)-[:KNOWS]->(b)', + name: 'Alice', + friend: 'David' + ) + }.not_to raise_error + end + end + + context 'when reading from the database' do + it 'accepts query with no additional parameters' do + expect { + driver.execute_query('MATCH (p:Person)-[:KNOWS]->(:Person) RETURN p.name AS name') + }.not_to raise_error + end + end + + context 'when updating the database' do + it 'accepts update query with keyword parameters' do + expect { + driver.execute_query( + 'MATCH (p:Person {name: $name}) SET p.age = $age', + name: 'Alice', + age: 42 + ) + }.not_to raise_error + end + + it 'accepts relationship creation with keyword parameters' do + expect { + driver.execute_query( + 'MATCH (alice:Person {name: $name}) MATCH (bob:Person {name: $friend}) CREATE (alice)-[:KNOWS]->(bob)', + name: 'Alice', + friend: 'Bob' + ) + }.not_to raise_error + end + end + + context 'when deleting from the database' do + it 'accepts delete query with keyword parameters' do + expect { + driver.execute_query( + 'MATCH (p:Person {name: $name}) DETACH DELETE p', + name: 'Alice' + ) + }.not_to raise_error + end + end + + context 'when using query configuration' do + it 'accepts nil auth_token with config hash and parameters' do + expect { + driver.execute_query( + 'MATCH (p:Person) RETURN p.name', + nil, + { database: 'neo4j' }, + age: 42 + ) + }.not_to raise_error + end + + it 'accepts auth_token with keyword parameters' do + auth_token = Neo4j::Driver::AuthTokens.basic(neo4j_user, neo4j_password) + + expect { + driver.execute_query( + 'MATCH (p:Person) RETURN p.name', + auth_token, + age: 42 + ) + }.not_to raise_error + end + end + + context 'when working with query summaries' do + it 'accepts UNWIND query without parameters' do + expect { + driver.execute_query("UNWIND ['Alice', 'Bob'] AS name MERGE (p:Person {name: name})") + }.not_to raise_error + end + + it 'accepts MERGE query with keyword parameters' do + expect { + driver.execute_query( + "MERGE (p:Person {name: $name}) MERGE (p)-[:KNOWS]->(:Person {name: $friend})", + name: 'Mark', + friend: 'Bob' + ) + }.not_to raise_error + end + + it 'accepts EXPLAIN query with keyword parameters' do + expect { + driver.execute_query( + 'EXPLAIN MATCH (p {name: $name}) RETURN p', + name: 'Alice' + ) + }.not_to raise_error + end + + it 'accepts shortestPath query with keyword parameters' do + expect { + driver.execute_query( + "MATCH p=shortestPath((:Person {name: $start})-[*]->(:Person {name: $end})) RETURN p", + start: 'Alice', + end: 'Bob' + ) + }.not_to raise_error + end + end + + context 'parameter handling' do + it 'handles mixed positional and keyword arguments correctly' do + expect { + driver.execute_query( + 'MATCH (p:Person {age: $age, name: $name}) RETURN p', + nil, + { database: 'neo4j' }, + age: 42, + name: 'Alice' + ) + }.not_to raise_error + end + + it 'handles only keyword arguments' do + expect { + driver.execute_query( + 'MATCH (p:Person {name: $name}) RETURN p', + name: 'Alice' + ) + }.not_to raise_error + end + end + end +end \ No newline at end of file From be8ebe731cda3892af29513f09615f63cdcc9468 Mon Sep 17 00:00:00 2001 From: Nick Saukin Date: Tue, 3 Jun 2025 16:19:21 +0200 Subject: [PATCH 06/14] Add newline on EOF --- spec/neo4j/driver/execute_query_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/neo4j/driver/execute_query_spec.rb b/spec/neo4j/driver/execute_query_spec.rb index 9b9984ac..ea6b30fb 100644 --- a/spec/neo4j/driver/execute_query_spec.rb +++ b/spec/neo4j/driver/execute_query_spec.rb @@ -154,4 +154,4 @@ end end end -end \ No newline at end of file +end From 8472b123cd7dd62707a3cfa9be82f75bea2247dd Mon Sep 17 00:00:00 2001 From: Nick Saukin Date: Tue, 3 Jun 2025 16:30:15 +0200 Subject: [PATCH 07/14] Use dynamic dispatch --- jruby/neo4j/driver/ext/internal_driver.rb | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/jruby/neo4j/driver/ext/internal_driver.rb b/jruby/neo4j/driver/ext/internal_driver.rb index 59635310..99e5bff8 100644 --- a/jruby/neo4j/driver/ext/internal_driver.rb +++ b/jruby/neo4j/driver/ext/internal_driver.rb @@ -12,16 +12,13 @@ module InternalDriver auto_closable :session def execute_query(query, auth_token = nil, config = {}, **parameters) - java_method(:executableQuery, [java.lang.String]) - .call(query) - .java_method(:withParameters, [java.util.Map]) - .call(parameters.transform_keys(&:to_s)) - .java_method(:withAuthToken, [org.neo4j.driver.AuthToken]) - .call(auth_token) - .java_method(:withConfig, [org.neo4j.driver.QueryConfig]) - .call(to_java_config(Neo4j::Driver::QueryConfig, **config)) - .java_method(:execute, []) - .call + check do + driver.executable_query(query) + .with_parameters(to_neo(parameters)) + .with_auth_token(auth_token) + .with_config(to_java_config(Neo4j::Driver::QueryConfig, **config)) + .execute + end end def session(**session_config) From 02e7c5721c276892ca5e1f2ecb0d3e086210b450 Mon Sep 17 00:00:00 2001 From: Nick Saukin Date: Tue, 3 Jun 2025 16:30:55 +0200 Subject: [PATCH 08/14] Enable execute_query in testkit for jruby --- .../lib/testkit/backend/messages/requests/get_features.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testkit-backend/lib/testkit/backend/messages/requests/get_features.rb b/testkit-backend/lib/testkit/backend/messages/requests/get_features.rb index 88a4fae4..edc1613e 100644 --- a/testkit-backend/lib/testkit/backend/messages/requests/get_features.rb +++ b/testkit-backend/lib/testkit/backend/messages/requests/get_features.rb @@ -8,7 +8,7 @@ class GetFeatures < Request { 'Feature:API:BookmarkManager' => 'a', 'Feature:API:ConnectionAcquisitionTimeout' => 'ja', - 'Feature:API:Driver.ExecuteQuery' => 'a', + 'Feature:API:Driver.ExecuteQuery' => 'ja', 'Feature:API:Driver:GetServerInfo' => '', 'Feature:API:Driver.IsEncrypted' => 'jar', 'Feature:API:Driver:NotificationsConfig' => 'ja', From d6b0c2a58408334e3d2d8cd8421f5f57c6a49f59 Mon Sep 17 00:00:00 2001 From: Nick Saukin Date: Tue, 3 Jun 2025 16:32:07 +0200 Subject: [PATCH 09/14] Disable spec for MRI for now --- spec/neo4j/driver/execute_query_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/neo4j/driver/execute_query_spec.rb b/spec/neo4j/driver/execute_query_spec.rb index ea6b30fb..191d8c5f 100644 --- a/spec/neo4j/driver/execute_query_spec.rb +++ b/spec/neo4j/driver/execute_query_spec.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -RSpec.describe Neo4j::Driver do +RSpec.describe Neo4j::Driver, concurrency: true do describe '#execute_query' do context 'when querying the database' do From 1367a7ef54a7f82e07e4b68f6cc38b65ffcfa383 Mon Sep 17 00:00:00 2001 From: Nick Saukin Date: Tue, 3 Jun 2025 17:31:54 +0200 Subject: [PATCH 10/14] Try ExecuteQuery testkit request --- .../backend/messages/requests/execute_query.rb | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 testkit-backend/lib/testkit/backend/messages/requests/execute_query.rb diff --git a/testkit-backend/lib/testkit/backend/messages/requests/execute_query.rb b/testkit-backend/lib/testkit/backend/messages/requests/execute_query.rb new file mode 100644 index 00000000..37e21dd9 --- /dev/null +++ b/testkit-backend/lib/testkit/backend/messages/requests/execute_query.rb @@ -0,0 +1,17 @@ +# frozen_string_literal: true + +module Testkit::Backend::Messages + module Requests + class ExecuteQuery < Request + def response + Responses::Result.new(fetch(driver_id).execute_query(cypher, auth_token, config, decode(params))) + end + + private + + def auth_token + config.authorizationToken + end + end + end +end From 31639e3c61c6f1a05aaf9e48cbf40bd55343af81 Mon Sep 17 00:00:00 2001 From: Nick Saukin Date: Thu, 5 Jun 2025 15:19:21 +0200 Subject: [PATCH 11/14] Fix for review --- jruby/neo4j/driver/ext/internal_driver.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/jruby/neo4j/driver/ext/internal_driver.rb b/jruby/neo4j/driver/ext/internal_driver.rb index 99e5bff8..b3f55016 100644 --- a/jruby/neo4j/driver/ext/internal_driver.rb +++ b/jruby/neo4j/driver/ext/internal_driver.rb @@ -13,10 +13,10 @@ module InternalDriver def execute_query(query, auth_token = nil, config = {}, **parameters) check do - driver.executable_query(query) - .with_parameters(to_neo(parameters)) + executable_query(query) .with_auth_token(auth_token) .with_config(to_java_config(Neo4j::Driver::QueryConfig, **config)) + .with_parameters(to_neo(parameters)) .execute end end From ed76a8133260bf9169e892f3488114c8af19d3d0 Mon Sep 17 00:00:00 2001 From: Nick Saukin Date: Fri, 6 Jun 2025 15:23:25 +0200 Subject: [PATCH 12/14] Fix testkit request (WIP) --- .../messages/requests/execute_query.rb | 10 +--- .../messages/requests/result_consume.rb | 46 ++--------------- .../messages/responses/eager_result.rb | 34 +++++++++++++ .../backend/messages/summary_helper.rb | 50 +++++++++++++++++++ 4 files changed, 88 insertions(+), 52 deletions(-) create mode 100644 testkit-backend/lib/testkit/backend/messages/responses/eager_result.rb create mode 100644 testkit-backend/lib/testkit/backend/messages/summary_helper.rb diff --git a/testkit-backend/lib/testkit/backend/messages/requests/execute_query.rb b/testkit-backend/lib/testkit/backend/messages/requests/execute_query.rb index 37e21dd9..a1e65588 100644 --- a/testkit-backend/lib/testkit/backend/messages/requests/execute_query.rb +++ b/testkit-backend/lib/testkit/backend/messages/requests/execute_query.rb @@ -1,16 +1,8 @@ -# frozen_string_literal: true - module Testkit::Backend::Messages module Requests class ExecuteQuery < Request def response - Responses::Result.new(fetch(driver_id).execute_query(cypher, auth_token, config, decode(params))) - end - - private - - def auth_token - config.authorizationToken + Responses::EagerResult.new(fetch(driver_id).execute_query(cypher, auth_token, config, **decode(params))) end end end diff --git a/testkit-backend/lib/testkit/backend/messages/requests/result_consume.rb b/testkit-backend/lib/testkit/backend/messages/requests/result_consume.rb index fbad9060..5d350a89 100644 --- a/testkit-backend/lib/testkit/backend/messages/requests/result_consume.rb +++ b/testkit-backend/lib/testkit/backend/messages/requests/result_consume.rb @@ -1,50 +1,10 @@ module Testkit::Backend::Messages module Requests class ResultConsume < Request - def process - named_entity('Summary', - **{ - serverInfo: to_map(summary.server, :protocol_version, :address, :agent), - counters: to_map(summary.counters, *%w[constraints_added constraints_removed contains_system_updates? contains_updates? indexes_added - indexes_removed labels_added labels_removed nodes_created nodes_deleted properties_set relationships_created - relationships_deleted system_updates]), - query: { text: summary.query.text, parameters: summary.query.parameters.transform_values(&method(:to_testkit)) }, - database: summary.database.name, - queryType: summary.query_type, - notifications: summary.notifications&.then(&method(:notifications)), - plan: (plan_to_h(summary.plan) if summary.has_plan?), - profile: summary.has_profile? ? summary.profile.then { |p| { db_hits: p.db_hits } } : nil, - }.merge!(to_map(summary, *%w[result_available_after result_consumed_after]))) - end - - private - - def summary - @object ||= fetch(result_id).consume - end - - def to_map(o, *methods) - methods.map { |name| [key(name), o.send(name).then { |obj| block_given? ? yield(obj) : obj }] }.to_h - end + include SummaryHelper - def key(name) - name.to_s.gsub('?', '').camelize(:lower).to_sym - end - - def map_entry(n, method, *methods) - n.send(method)&.then { |o| { key(method) => to_map(o, *methods) } } || {} - end - - def notifications(ns) - ns.map do |n| - to_map(n, *%w[code title description raw_category severity raw_severity_level]) - .merge(to_map(n, *%w[category severity_level]) { |o| o&.name || 'UNKNOWN' }) - .merge(map_entry(n, :position, :column, :line, :offset)) - end - end - - def plan_to_h(plan) - plan.to_h.transform_keys(&method(:key)).tap {|hash| hash[:children]&.map!(&method(:plan_to_h))} + def process + summary_to_testkit(fetch(result_id).consume) end end end diff --git a/testkit-backend/lib/testkit/backend/messages/responses/eager_result.rb b/testkit-backend/lib/testkit/backend/messages/responses/eager_result.rb new file mode 100644 index 00000000..bdf24bf4 --- /dev/null +++ b/testkit-backend/lib/testkit/backend/messages/responses/eager_result.rb @@ -0,0 +1,34 @@ +module Testkit + module Backend + module Messages + module Responses + class EagerResult < Response + alias_method :response_to_testkit, :to_testkit + + include Conversion + alias_method :value_to_testkit, :to_testkit + + include SummaryHelper + + def to_testkit(*args) + if args.empty? + response_to_testkit + else + value_to_testkit(*args) + end + end + + def data + { + keys: @object.records.first&.keys || [], + records: @object.records.map do |record| + { values: record.values.map(&method(:to_testkit)) } + end, + summary: summary_to_testkit(@object.summary)[:data] + } + end + end + end + end + end +end diff --git a/testkit-backend/lib/testkit/backend/messages/summary_helper.rb b/testkit-backend/lib/testkit/backend/messages/summary_helper.rb new file mode 100644 index 00000000..40c5904d --- /dev/null +++ b/testkit-backend/lib/testkit/backend/messages/summary_helper.rb @@ -0,0 +1,50 @@ +module Testkit + module Backend + module Messages + module SummaryHelper + def summary_to_testkit(summary) + named_entity('Summary', + **{ + serverInfo: to_map(summary.server, :protocol_version, :address, :agent), + counters: to_map(summary.counters, *%w[constraints_added constraints_removed contains_system_updates? contains_updates? indexes_added indexes_removed labels_added labels_removed nodes_created nodes_deleted properties_set relationships_created relationships_deleted system_updates]), + query: { + text: summary.query.text, + parameters: summary.query.parameters.transform_values(&method(:to_testkit)) + }, + database: summary.database.name, + queryType: summary.query_type, + notifications: summary.notifications&.then(&method(:notifications)), + plan: (plan_to_h(summary.plan) if summary.has_plan?), + profile: summary.has_profile? ? summary.profile.then { |p| { db_hits: p.db_hits } } : nil + }.merge!(to_map(summary, *%w[result_available_after result_consumed_after]))) + end + + private + + def to_map(o, *methods) + methods.map { |name| [key(name), o.send(name).then { |obj| block_given? ? yield(obj) : obj }] }.to_h + end + + def key(name) + name.to_s.gsub('?', '').camelize(:lower).to_sym + end + + def map_entry(n, method, *methods) + n.send(method)&.then { |o| { key(method) => to_map(o, *methods) } } || {} + end + + def notifications(ns) + ns.map do |n| + to_map(n, *%w[code title description raw_category severity raw_severity_level]) + .merge(to_map(n, *%w[category severity_level]) { |o| o&.name || 'UNKNOWN' }) + .merge(map_entry(n, :position, :column, :line, :offset)) + end + end + + def plan_to_h(plan) + plan.to_h.transform_keys(&method(:key)).tap { |hash| hash[:children]&.map!(&method(:plan_to_h)) } + end + end + end + end +end From 60b3ebfc4c4ce6a814422e0b8191258f69174825 Mon Sep 17 00:00:00 2001 From: Nick Saukin Date: Wed, 11 Jun 2025 13:39:50 +0200 Subject: [PATCH 13/14] Add execute_query to MRI --- ruby/neo4j/driver/internal/internal_driver.rb | 16 ++++++++++++++++ .../driver/internal/internal_eager_result.rb | 12 ++++++++++++ 2 files changed, 28 insertions(+) create mode 100644 ruby/neo4j/driver/internal/internal_eager_result.rb diff --git a/ruby/neo4j/driver/internal/internal_driver.rb b/ruby/neo4j/driver/internal/internal_driver.rb index 6a211388..1daf604a 100644 --- a/ruby/neo4j/driver/internal/internal_driver.rb +++ b/ruby/neo4j/driver/internal/internal_driver.rb @@ -25,6 +25,22 @@ def async_session(**session_config) InternalAsyncSession.new(new_session(**session_config)) end + def execute_query(query, auth_token = nil, config = {}, **parameters) + session_config_keys = %i[bookmarks database impersonated_user default_access_mode fetch_size] + tx_config_keys = %i[timeout metadata] + + session_config = config.slice(*session_config_keys) + session_config[:auth] = auth_token if auth_token + tx_config = config.slice(*tx_config_keys) + + session(**session_config) do |session| + result = session.run(query, parameters, tx_config) + records = result.to_a + summary = result.consume + InternalEagerResult.new(records, summary) + end + end + def encrypted? assert_open! @security_plan.requires_encryption? diff --git a/ruby/neo4j/driver/internal/internal_eager_result.rb b/ruby/neo4j/driver/internal/internal_eager_result.rb new file mode 100644 index 00000000..dc40cb43 --- /dev/null +++ b/ruby/neo4j/driver/internal/internal_eager_result.rb @@ -0,0 +1,12 @@ +module Neo4j::Driver + module Internal + class InternalEagerResult + attr_reader :records, :summary + + def initialize(records, summary) + @records = records + @summary = summary + end + end + end +end From 7afda0e54df78ac21a538af829825795f175397a Mon Sep 17 00:00:00 2001 From: Nick Saukin Date: Wed, 11 Jun 2025 13:58:07 +0200 Subject: [PATCH 14/14] Enable execute_query spec for MRI --- spec/neo4j/driver/execute_query_spec.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spec/neo4j/driver/execute_query_spec.rb b/spec/neo4j/driver/execute_query_spec.rb index 191d8c5f..ea6b30fb 100644 --- a/spec/neo4j/driver/execute_query_spec.rb +++ b/spec/neo4j/driver/execute_query_spec.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -RSpec.describe Neo4j::Driver, concurrency: true do +RSpec.describe Neo4j::Driver do describe '#execute_query' do context 'when querying the database' do