redgraph 0.1.0 → 0.1.1

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
  SHA256:
3
- metadata.gz: 80c7cce1d1d19897882873e07e7a5a1fadabbb52d14717e16ff113f83511b32a
4
- data.tar.gz: 72be15f7b95a7b45ec9ec21adb54f54676e0f960938c602fbb8381ae3ca1c682
3
+ metadata.gz: '0171849182c559f603bf4e09d1cb17eb5a3a4e3d95ddf8e6f1853434c0fc9380'
4
+ data.tar.gz: 7bdff0a775ebeffffe6b842b07a990292d351ee477c4aa2ef8ec492806a0b048
5
5
  SHA512:
6
- metadata.gz: cce480b50ada0fb75bb1491d730668a8ac7f92be766dd161b1b3c3fa8082d579d7276383adb2966894388f6c95fb7e444abd9eb2935e50f6659d35be938df450
7
- data.tar.gz: 806e2105e78b9c6a188dd271ed7b6315ec9afbe0bbd6d1008eb2c4f991e756512e7b4a83dbb7808b944ab2c8b66671f270cb1a4008a476945c9f20818209dad9
6
+ metadata.gz: 53de618a85999bd837e1fabb458c204ac7e0f783425cef8f1d0c07e810c33f580c41d9fd8bf124015970618d6c905c8945020c06a382ae2f692384d0df856482
7
+ data.tar.gz: 66866ac946e4b7456684e26587bfcec17eec93de0e4c84bc6827ee77f1f712adce2b895fc38138522c0635fe2ade930a5606e3f638eaec8ab10afc71879e612e
data/CHANGELOG.md CHANGED
@@ -1,4 +1,8 @@
1
- ## [Unreleased]
1
+ ## [0.1.1] - 2021-04-11
2
+
3
+ - Graph#nodes:
4
+ - filter by properties
5
+ - skip and limit options
2
6
 
3
7
  ## [0.1.0] - 2021-04-08
4
8
 
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- redgraph (0.1.0)
4
+ redgraph (0.1.1)
5
5
  redis (~> 4)
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -47,6 +47,7 @@ To get all nodes:
47
47
  Optional filters:
48
48
 
49
49
  @graph.nodes(label: 'actor')
50
+ @graph.nodes(properties: {name: "Al Pacino"})
50
51
 
51
52
  ## Development
52
53
 
@@ -73,17 +73,27 @@ module Redgraph
73
73
  end
74
74
  end
75
75
 
76
- def nodes(label: nil)
77
- node_or_node_with_label = label ? "node:`#{label}`" : "node"
76
+ # Returns nodes. Options:
77
+ #
78
+ # - label: filter by label
79
+ # - properties: filter by properties
80
+ # - limit: number of items
81
+ # - skip: items offset (useful for pagination)
82
+ #
83
+ def nodes(label: nil, properties: nil, limit: nil, skip: nil)
84
+ _label = ":`#{label}`" if label
85
+ _props = quote_hash(properties) if properties
86
+ _limit = "LIMIT #{limit}" if limit
87
+ _skip = "SKIP #{skip}" if skip
78
88
 
79
- cmd = "MATCH (#{node_or_node_with_label}) RETURN node"
89
+ cmd = "MATCH (node#{_label} #{_props}) RETURN node #{_skip} #{_limit}"
80
90
  result = query(cmd)
81
91
 
82
92
  result.resultset.map do |item|
83
- (node_id, labels, properties) = item["node"]
93
+ (node_id, labels, props) = item["node"]
84
94
  attrs = {}
85
95
 
86
- properties.each do |(index, type, value)|
96
+ props.each do |(index, type, value)|
87
97
  attrs[get_property(index)] = value
88
98
  end
89
99
  Node.new(label: get_label(labels.first), properties: attrs).tap do |node|
@@ -112,11 +122,9 @@ module Redgraph
112
122
  end
113
123
 
114
124
  def quote_hash(hash)
115
- out = "{"
116
- hash.each do |k,v|
117
- out += "#{k}:#{escape_value(v)}"
118
- end
119
- out + "}"
125
+ "{" +
126
+ hash.map {|k,v| "#{k}:#{escape_value(v)}" }.join(", ") +
127
+ "}"
120
128
  end
121
129
 
122
130
  def escape_value(x)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Redgraph
4
- VERSION = "0.1.0"
4
+ VERSION = "0.1.1"
5
5
  end
@@ -5,11 +5,9 @@ require "test_helper"
5
5
  class GraphQueriesTest < Minitest::Test
6
6
  def setup
7
7
  @graph = Redgraph::Graph.new("movies", url: $REDIS_URL)
8
- @actor = Redgraph::Node.new(label: 'actor', properties: {name: "Al Pacino"})
9
- @graph.add_node(@actor)
10
8
 
11
- @other_actor = Redgraph::Node.new(label: 'actor', properties: {name: "John Travolta"})
12
- refute_nil(@actor.id)
9
+ @al = quick_add_node(label: 'actor', properties: {name: "Al Pacino"})
10
+ @john = quick_add_node(label: 'actor', properties: {name: "John Travolta"})
13
11
  end
14
12
 
15
13
  def teardown
@@ -17,42 +15,76 @@ class GraphQueriesTest < Minitest::Test
17
15
  end
18
16
 
19
17
  def test_find_node_by_id
20
- node = @graph.find_node_by_id(@actor.id)
18
+ node = @graph.find_node_by_id(@al.id)
21
19
 
22
20
  refute_nil(node)
23
21
  assert_equal("actor", node.label)
24
22
  assert_equal("Al Pacino", node.properties["name"])
25
- assert_equal(@actor.id, node.id)
23
+ assert_equal(@al.id, node.id)
26
24
  end
27
25
 
28
- def test_get_all_nodes
29
- @graph.add_node(@other_actor)
26
+ def test_find_node_by_wrong_id
27
+ node = @graph.find_node_by_id("-1")
28
+
29
+ assert_nil(node)
30
+ end
30
31
 
32
+ def test_find_all_nodes
31
33
  actors = @graph.nodes
32
34
 
33
35
  assert_equal(2, actors.size)
34
- assert_includes(actors, @actor)
35
- assert_includes(actors, @other_actor)
36
+ assert_includes(actors, @al)
37
+ assert_includes(actors, @john)
36
38
  end
37
39
 
38
- def test_get_all_nodes_by_label
39
- @graph.add_node(@other_actor)
40
- film = Redgraph::Node.new(label: 'film', properties: {name: "Scarface"})
41
- @graph.add_node(film)
40
+ def test_find_all_nodes_by_label
41
+ film = quick_add_node(label: 'film', properties: {name: "Scarface"})
42
42
 
43
43
  actors = @graph.nodes(label: 'actor')
44
44
  assert_equal(2, actors.size)
45
- assert_includes(actors, @actor)
46
- assert_includes(actors, @other_actor)
45
+ assert_includes(actors, @al)
46
+ assert_includes(actors, @john)
47
47
 
48
48
  films = @graph.nodes(label: 'film')
49
49
  assert_equal(1, films.size)
50
50
  assert_includes(films, film)
51
51
  end
52
52
 
53
- def test_find_node_by_wrong_id
54
- node = @graph.find_node_by_id("-1")
53
+ def test_find_all_nodes_by_property
54
+ scarface = quick_add_node(label: 'film', properties: {name: "Scarface", genre: "drama"})
55
+ casino = quick_add_node(label: 'film', properties: {name: "Casino", genre: "drama"})
56
+ mamma_mia = quick_add_node(label: 'film', properties: {name: "Mamma Mia", genre: "musical"})
55
57
 
56
- assert_nil(node)
58
+ dramas = @graph.nodes(properties: {genre: "drama"})
59
+
60
+ assert_equal(2, dramas.size)
61
+ assert_includes(dramas, scarface)
62
+ assert_includes(dramas, casino)
63
+ end
64
+
65
+ def test_limit_nodes
66
+ 10.times do |i|
67
+ quick_add_node(label: 'token', properties: {number: i})
68
+ end
69
+
70
+ items = @graph.nodes(label: 'token', limit: 5)
71
+ assert_equal(5, items.size)
72
+ assert_equal([0,1,2,3,4], items.map{|item| item.properties["number"]})
73
+ end
74
+
75
+ def test_skip_nodes
76
+ 10.times do |i|
77
+ quick_add_node(label: 'token', properties: {number: i})
78
+ end
79
+
80
+ items = @graph.nodes(label: 'token', limit: 3, skip: 3)
81
+ assert_equal(3, items.size)
82
+ assert_equal([3,4,5], items.map{|item| item.properties["number"]})
83
+ end
84
+
85
+ private
86
+
87
+ def quick_add_node(label:, properties:)
88
+ @graph.add_node(Redgraph::Node.new(label: label, properties: properties))
57
89
  end
58
90
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: redgraph
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Paolo Zaccagnini
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-04-10 00:00:00.000000000 Z
11
+ date: 2021-04-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: redis