neo4j-core 3.0.4 → 3.0.5

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: da521626106112cd3b3f3f2a4f7ea630f9cf147f
4
- data.tar.gz: d6c94b7d176c36d70d0436db4f307dd9bc478c15
3
+ metadata.gz: 20021948746b82897d81ebb31d4a59767358dcd2
4
+ data.tar.gz: 6cd5c4daf6d4a3ba0a0e42265633bbefc3e48a91
5
5
  SHA512:
6
- metadata.gz: af84ab4cc337da17517d0443ba699b7ec247d26b92d3258862ad9cf151b9fbfae877ad72b05ea73fb6661f37eb3ec4511e9485d21bd6a7404c70086d6228fe05
7
- data.tar.gz: ebea9a3a22f0f70ff051f0ab1d2fce8e466a94afb021c9c96e2043320f044ec17671639b2b07bba8ad0d337c40f9e5ec81ba56e4935cf7a84521b3d636d2c7b6
6
+ metadata.gz: 8676dfad9c081b81a232d32d4fd9466a47918ad4de2ccfbd0d4bff7215b1fe2050e9d395d23d04f5e40c8c52c6c92ec546c746f60aa7d959a511c647e9a742c7
7
+ data.tar.gz: 07531aa910bac193d36a0c16b76df81ef7862579c3981d0f4bce5dacb130aeb744445336a65b9b163d0c3d4d4a49fd518e7d492849b466025532ee27dce7b7b4
data/lib/neo4j-core.rb CHANGED
@@ -7,6 +7,7 @@ require 'neo4j/property_container'
7
7
  require 'neo4j-core/active_entity'
8
8
  require 'neo4j-core/helpers'
9
9
  require 'neo4j-core/cypher_translator'
10
+ require 'neo4j-core/query_find_in_batches'
10
11
  require 'neo4j-core/query'
11
12
 
12
13
  require 'neo4j/entity_equality'
@@ -12,6 +12,7 @@ module Neo4j::Core
12
12
  # http://docs.neo4j.org/chunked/milestone/cypher-query-lang.html
13
13
  class Query
14
14
  include Neo4j::Core::QueryClauses
15
+ include Neo4j::Core::QueryFindInBatches
15
16
 
16
17
  def initialize(options = {})
17
18
  @session = options[:session] || Neo4j::Session.current
@@ -113,6 +114,14 @@ module Neo4j::Core
113
114
  alias_method :offset, :skip
114
115
  alias_method :order_by, :order
115
116
 
117
+ # Clears out previous order clauses and allows only for those specified by args
118
+ def reorder(*args)
119
+ query = self.copy
120
+
121
+ query.remove_clause_class(OrderClause)
122
+ query.order(*args)
123
+ end
124
+
116
125
  # Works the same as the #set method, but when given a nested array it will set properties rather than setting entire objects
117
126
  # @example
118
127
  # # Creates a query representing the cypher: MATCH (n:Person) SET n.age = 19
@@ -210,7 +219,7 @@ module Neo4j::Core
210
219
  end
211
220
 
212
221
  def return_query(columns)
213
- query = self.dup
222
+ query = self.copy
214
223
  query.remove_clause_class(ReturnClause)
215
224
 
216
225
  columns = columns.map do |column_definition|
@@ -270,6 +279,15 @@ module Neo4j::Core
270
279
  end.params(other_query._params)
271
280
  end
272
281
 
282
+ MEMOIZED_INSTANCE_VARIABLES = [:response, :merge_params]
283
+ def copy
284
+ self.dup.tap do |query|
285
+ MEMOIZED_INSTANCE_VARIABLES.each do |var|
286
+ query.instance_variable_set("@#{var}", nil)
287
+ end
288
+ end
289
+ end
290
+
273
291
  protected
274
292
  attr_accessor :session, :options, :clauses, :_params
275
293
 
@@ -285,14 +303,14 @@ module Neo4j::Core
285
303
  private
286
304
 
287
305
  def build_deeper_query(clause_class, args = {}, options = {})
288
- self.dup.tap do |new_query|
306
+ self.copy.tap do |new_query|
289
307
  new_query.add_clauses [nil] if [nil, WithClause].include?(clause_class)
290
308
  new_query.add_clauses clause_class.from_args(args, options) if clause_class
291
309
  end
292
310
  end
293
311
 
294
312
  def break_deeper_query
295
- self.dup.tap do |new_query|
313
+ self.copy.tap do |new_query|
296
314
  new_query.add_clauses [nil]
297
315
  end
298
316
  end
@@ -0,0 +1,41 @@
1
+ module Neo4j::Core
2
+ module QueryFindInBatches
3
+
4
+ def find_in_batches(node_var, prop_var, options = {})
5
+ invalid_keys = options.keys.map(&:to_sym) - [:batch_size]
6
+ raise ArgumentError, "Invalid keys: #{invalid_keys.join(', ')}" if not invalid_keys.empty?
7
+
8
+ batch_size = options.delete(:batch_size) || 1000
9
+
10
+ query = self.reorder(node_var => prop_var).limit(batch_size)
11
+
12
+ records = query.to_a
13
+
14
+ while records.any?
15
+ records_size = records.size
16
+ primary_key_offset = begin
17
+ records.last.send(node_var).send(prop_var)
18
+ rescue NoMethodError
19
+ begin
20
+ records.last.send(node_var)[prop_var.to_sym]
21
+ rescue NoMethodError
22
+ records.last.send("#{node_var}.#{prop_var}") # In case we're explicitly returning it
23
+ end
24
+ end
25
+
26
+ yield records
27
+
28
+ break if records_size < batch_size
29
+
30
+ records = query.where("#{node_var}.#{prop_var} > {primary_key_offset}").params(primary_key_offset: primary_key_offset).to_a
31
+ end
32
+ end
33
+
34
+ def find_each(*args)
35
+ find_in_batches(*args) do |batch|
36
+ batch.each { |result| yield result }
37
+ end
38
+ end
39
+ end
40
+ end
41
+
@@ -1,5 +1,5 @@
1
1
  module Neo4j
2
2
  module Core
3
- VERSION = "3.0.4"
3
+ VERSION = "3.0.5"
4
4
  end
5
5
  end
@@ -8,7 +8,7 @@ module Neo4j::Server
8
8
  class CypherSession < Neo4j::Session
9
9
  include Resource
10
10
  include Neo4j::Core::CypherTranslator
11
-
11
+
12
12
  alias_method :super_query, :query
13
13
  attr_reader :connection
14
14
 
@@ -36,6 +36,7 @@ module Neo4j::Server
36
36
  # @param [String] endpoint_url - the url to the neo4j server, defaults to 'http://localhost:7474'
37
37
  # @param [Hash] params faraday params, see #create_connection or an already created faraday connection
38
38
  def self.open(endpoint_url=nil, params = {})
39
+ extract_basic_auth(endpoint_url, params)
39
40
  connection = params[:connection] || create_connection(params)
40
41
  url = endpoint_url || 'http://localhost:7474'
41
42
  response = connection.get(url)
@@ -48,6 +49,15 @@ module Neo4j::Server
48
49
  CypherSession.new(data_url, connection)
49
50
  end
50
51
 
52
+ def self.extract_basic_auth(url, params)
53
+ return unless url && URI(url).userinfo
54
+ params[:basic_auth] = {
55
+ username: URI(url).user,
56
+ password: URI(url).password
57
+ }
58
+ end
59
+ private_class_method :extract_basic_auth
60
+
51
61
  def initialize(data_url, connection)
52
62
  @connection = connection
53
63
  Neo4j::Session.register(self)
@@ -168,7 +178,7 @@ module Neo4j::Server
168
178
 
169
179
  def find_nodes(label_name, key, value)
170
180
  value = "'#{value}'" if value.is_a? String
171
-
181
+
172
182
  response = _query_or_fail <<-CYPHER
173
183
  MATCH (n:`#{label_name}`)
174
184
  WHERE n.#{key} = #{value}
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: neo4j-core
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.4
4
+ version: 3.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Andreas Ronge
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-31 00:00:00.000000000 Z
11
+ date: 2014-11-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: httparty
@@ -154,6 +154,7 @@ files:
154
154
  - lib/neo4j-core/label.rb
155
155
  - lib/neo4j-core/query.rb
156
156
  - lib/neo4j-core/query_clauses.rb
157
+ - lib/neo4j-core/query_find_in_batches.rb
157
158
  - lib/neo4j-core/version.rb
158
159
  - lib/neo4j-embedded.rb
159
160
  - lib/neo4j-embedded/cypher_response.rb
@@ -214,7 +215,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
214
215
  version: '0'
215
216
  requirements: []
216
217
  rubyforge_project: neo4j-core
217
- rubygems_version: 2.2.2
218
+ rubygems_version: 2.4.2
218
219
  signing_key:
219
220
  specification_version: 4
220
221
  summary: A graph database for Ruby