neo4apis 0.0.2 → 0.0.3

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: 435f18b35183016cf989780b44ca0e551f53c4b2
4
- data.tar.gz: 127f94b29ba58b55709691b6c3823c384daf0dbd
3
+ metadata.gz: 6703750242a5bf7db9c935381dd13a2a02a3dd80
4
+ data.tar.gz: e2c20ffd72feac0aceaef04e20b543abbae9dd8d
5
5
  SHA512:
6
- metadata.gz: ea2f6f6f40d3a224fe39c57c6ca25b6a248b51aac3f3e71c2e759bc1952f97d65ae79228430e73aaabd78a6d8c818984ad83fcde4ed6ab097e3b3d9e0395586c
7
- data.tar.gz: 240362413f2b4bfb21efb5ee9b73e3a0423dd1be6b78d5a5a7632f167af382f1e09af167c9462ada6f451ee389410cd053ae0851fbfa0ab4c0eb664ac993f8fa
6
+ metadata.gz: 4a468fa6fa75440aafde30ab50af48cffffb46f80df45830ae98005280e860034896c2464efa01c7841d1d4746fc06b7cf9e14ed971a031cddc61a2f8ca83368
7
+ data.tar.gz: 64f6bdcfb90480b494f141d2458e978556dc31d2671e4d056845b40f3e67570a601c804f072cd2f1529fc5267b5067ab61de17032c71458cea1384bb26ab2186
@@ -1,6 +1,4 @@
1
1
  require 'neo4j-core'
2
2
 
3
- require 'neo4apis/version'
4
-
5
3
  require 'neo4apis/query_buffer'
6
4
  require 'neo4apis/base'
@@ -1,25 +1,27 @@
1
1
  module Neo4Apis
2
2
  class Base
3
- DEFAULT_FLUSH_SIZE = 500
4
-
3
+ UUID_FIELDS = {}
5
4
  NODE_PROXIES = {}
6
5
  IMPORTERS = {}
7
6
 
8
7
  attr_reader :options
9
8
 
10
9
  def initialize(neo4j_session, options = {})
11
- @buffer = QueryBuffer.new(neo4j_session)
10
+ @buffer = QueryBuffer.new(neo4j_session, options[:flush_size] || self.class.default_flush_size)
12
11
  @options = options
13
- @flush_size = DEFAULT_FLUSH_SIZE
12
+
13
+ UUID_FIELDS.each do |label, uuid_field|
14
+ @buffer << create_constraint_query(label, uuid_field)
15
+ end
16
+ @buffer.flush
14
17
  end
15
18
 
16
19
  def add_node(label, props = {})
17
20
  require_batch
18
21
 
19
- node_proxy = NODE_PROXIES[label]
20
- raise ArgumentError, "No UUID specified for label `#{label}`" if not node_proxy
22
+ raise ArgumentError, "No UUID specified for label `#{label}`" if not UUID_FIELDS[label.to_sym]
21
23
 
22
- node_proxy.new(label, props).tap do |node_proxy|
24
+ self.class.node_proxy(label).new(props).tap do |node_proxy|
23
25
  @buffer << create_node_query(node_proxy)
24
26
  end
25
27
  end
@@ -38,7 +40,7 @@ module Neo4Apis
38
40
 
39
41
  instance_eval &block
40
42
 
41
- @buffer.flush
43
+ @buffer.close
42
44
  ensure
43
45
  @in_batch = false
44
46
  end
@@ -47,49 +49,70 @@ module Neo4Apis
47
49
  self.instance_exec object, &IMPORTERS[label.to_sym]
48
50
  end
49
51
 
52
+ def self.prefix(prefix)
53
+ @prefix = prefix
54
+ end
55
+
50
56
  def self.importer(label, &block)
51
57
  IMPORTERS[label.to_sym] = block
52
58
  end
53
59
 
54
60
  def self.uuid(label, uuid_field)
55
- NODE_PROXIES[label.to_sym] = node_proxy_from_uuid(label.to_sym, uuid_field.to_sym)
61
+ UUID_FIELDS[label.to_sym] = uuid_field.to_sym
62
+ end
63
+
64
+ def self.node_proxy(label)
65
+ uuid_field = UUID_FIELDS[label.to_sym]
66
+
67
+ NODE_PROXIES[label.to_sym] ||= node_proxy_from_uuid(label, uuid_field)
56
68
  end
57
69
 
58
70
  def self.node_proxy_from_uuid(label, uuid_field)
59
- Struct.new(:label, :props) do
60
- const_set(:UUID_FIELD, uuid_field)
71
+ Struct.new(:props) do
72
+ const_set(:UUID_FIELD, uuid_field.to_sym)
73
+ const_set(:LABEL, label.to_sym)
74
+
75
+ def uuid_field
76
+ self.class::UUID_FIELD
77
+ end
78
+
79
+ def label
80
+ self.class::LABEL
81
+ end
61
82
 
62
83
  def uuid_value
63
84
  raise ArgumentError, "props does not have UUID field `#{uuid_field}` for #{self.inspect}" if not props.has_key?(uuid_field)
64
85
 
65
86
  props[uuid_field]
66
87
  end
67
-
68
- def uuid_field
69
- self.class::UUID_FIELD
70
- end
71
88
  end
72
89
  end
73
90
 
91
+ def self.default_flush_size
92
+ 500
93
+ end
94
+
74
95
  private
75
96
 
76
97
  def create_node_query(node_proxy)
77
98
  Neo4j::Core::Query.new.
78
- merge(node: {node_proxy.label => {node_proxy.uuid_field => node_proxy.uuid_value}}).
99
+ merge(node: {self.class.full_label(node_proxy.label) => {node_proxy.uuid_field => node_proxy.uuid_value}}).
79
100
  on_create_set(node: node_proxy.props)
80
101
  end
81
102
 
82
103
  def create_relationship_query(type, source, target, props)
83
104
  Neo4j::Core::Query.new.
84
- match(source: {source.label => {source.uuid_field => source.uuid_value}}).
85
- match(target: {target.label => {target.uuid_field => target.uuid_value}}).
105
+ match(source: {self.class.full_label(source.label) => {source.uuid_field => source.uuid_value}}).
106
+ match(target: {self.class.full_label(target.label) => {target.uuid_field => target.uuid_value}}).
86
107
  merge("source-[:#{type}]->target")
87
108
  end
88
109
 
89
- def add_to_buffer(*args)
90
- flush_buffer if buffer.size >= FLUSH_SIZE
110
+ def create_constraint_query(label, uuid_field)
111
+ Neo4j::Core::Query.new.create("CONSTRAINT ON (node:#{self.class.full_label(label)}) ASSERT node.#{uuid_field} IS UNIQUE")
112
+ end
91
113
 
92
- @buffer << args
114
+ def self.full_label(label)
115
+ "#{@prefix}#{label}".to_sym
93
116
  end
94
117
 
95
118
  def require_batch
@@ -1,8 +1,9 @@
1
1
  module Neo4Apis
2
2
  class QueryBuffer < Array
3
3
 
4
- def initialize(neo4j_session)
4
+ def initialize(neo4j_session, flush_size)
5
5
  @neo4j_session = neo4j_session
6
+ @flush_size = flush_size
6
7
 
7
8
  uri = URI.parse(@neo4j_session.resource_url)
8
9
 
@@ -15,17 +16,25 @@ module Neo4Apis
15
16
  super()
16
17
  end
17
18
 
19
+ def <<(query)
20
+ flush if size >= @flush_size
21
+
22
+ super
23
+ end
24
+
18
25
  def flush
19
26
  execute
20
27
 
21
28
  clear
22
29
  end
23
30
 
31
+ def close
32
+ flush
33
+ end
24
34
 
25
35
  private
26
36
 
27
37
  def execute
28
- puts "request_body_data", request_body_data.inspect
29
38
  @faraday_connection.post do |req|
30
39
  req.url '/db/data/transaction/commit'
31
40
  req.headers['Accept'] = 'application/json; charset=UTF-8'
@@ -1,11 +1,9 @@
1
1
  lib = File.expand_path('../lib/', __FILE__)
2
2
  $:.unshift lib unless $:.include?(lib)
3
3
 
4
- require 'neo4apis/version'
5
-
6
4
  Gem::Specification.new do |s|
7
5
  s.name = "neo4apis"
8
- s.version = Neo4Apis::VERSION
6
+ s.version = '0.0.3'
9
7
  s.required_ruby_version = ">= 1.9.1"
10
8
 
11
9
  s.authors = "Brian Underwood"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: neo4apis
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brian Underwood
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-10-30 00:00:00.000000000 Z
11
+ date: 2014-10-31 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -50,7 +50,6 @@ files:
50
50
  - lib/neo4apis.rb
51
51
  - lib/neo4apis/base.rb
52
52
  - lib/neo4apis/query_buffer.rb
53
- - lib/neo4apis/version.rb
54
53
  - neo4apis.gemspec
55
54
  homepage: https://github.com/neo4jrb/neo4apis/
56
55
  licenses:
@@ -77,3 +76,4 @@ signing_key:
77
76
  specification_version: 4
78
77
  summary: An API to import web API data to neo4j
79
78
  test_files: []
79
+ has_rdoc:
@@ -1,3 +0,0 @@
1
- module Neo4Apis
2
- VERSION = '0.0.2'
3
- end