mementus 0.2.3 → 0.2.4

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: 92652ba97da7674692fac49d6ea139aeb9c680d5
4
- data.tar.gz: 5ea49d59abd929eb237956e2dea519e1300e94c6
3
+ metadata.gz: 9008afd3cf8e01e46d74afdb9ba4421ba5fa6576
4
+ data.tar.gz: 3a23ffd82033bad559238dd80ec316efb86feb60
5
5
  SHA512:
6
- metadata.gz: 6bf3f09c02410fbc0070d40d0016d5161f57cecf975a660ccedebcb0d10fdebdf11e01cf63e350d1fc9d33fface9ebc81d9b64002dba5911221d4dd1a6f2b3c5
7
- data.tar.gz: c36019eb7529244bf07b4f5c1654c87e5d55c6e675e16bd82fcdce6fccb12a328d78595170b3dc698b4a41a37967c4b437c0d19c945a0bba5e3b3d0c50cb5589
6
+ metadata.gz: a51672c818d3883aeecf5a599e8b33c6f5f342e8434345e3c93d60749a591781b8557dd640c3e74b98abb222702dd6a2a28ade00702f452f723f7144be3fb9a6
7
+ data.tar.gz: c35706222b866937ad4439a762df37969cd800bae904f91751c6eb2b557c293cdd2085676e53a4dee70ca667b09b5086244af3e05b84dea4db0daa9258b29c87
@@ -0,0 +1,13 @@
1
+ module Mementus
2
+ module Query
3
+ class Source
4
+ def initialize(graph)
5
+ @traversal = Traversal.new(graph)
6
+ end
7
+
8
+ def node(id)
9
+ @traversal.add_step(Step.new(@traversal, id))
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,13 @@
1
+ module Mementus
2
+ module Query
3
+ class Step
4
+ def initialize(traversal, id)
5
+ @node = NodeProxy.new(traversal.graph.node(id), traversal.graph)
6
+ end
7
+
8
+ def to_node
9
+ @node
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,25 @@
1
+ module Mementus
2
+ module Query
3
+ class Traversal
4
+ attr_reader :graph
5
+
6
+ def initialize(graph)
7
+ @graph = graph
8
+ @steps = []
9
+ end
10
+
11
+ def add_step(step)
12
+ @steps << step
13
+ self
14
+ end
15
+
16
+ def adjacent
17
+ @steps.last.to_node.adjacent
18
+ end
19
+
20
+ def id
21
+ @steps.last.to_node.id
22
+ end
23
+ end
24
+ end
25
+ end
@@ -1,3 +1,3 @@
1
1
  module Mementus
2
- VERSION = '0.2.3'.freeze
2
+ VERSION = '0.2.4'.freeze
3
3
  end
data/lib/mementus.rb CHANGED
@@ -4,3 +4,6 @@ require_relative 'mementus/edge'
4
4
  require_relative 'mementus/node_proxy'
5
5
  require_relative 'mementus/depth_first_search'
6
6
  require_relative 'mementus/breadth_first_search'
7
+ require_relative 'mementus/query/source'
8
+ require_relative 'mementus/query/step'
9
+ require_relative 'mementus/query/traversal'
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+
3
+ describe Mementus::Query do
4
+ let(:query) do
5
+ graph = Mementus::Graph.new
6
+ graph.add_edge(Mementus::Edge.new(Mementus::Node.new(1, :node), Mementus::Node.new(2, :node)))
7
+ Mementus::Query::Source.new(graph)
8
+ end
9
+
10
+ specify '#node' do
11
+ expect(query.node(1).id).to eq(1)
12
+ end
13
+
14
+ specify '#node#adjacent' do
15
+ expect(query.node(1).adjacent.first.id).to eq(2)
16
+ end
17
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mementus
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.2.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - maetl
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-04-11 00:00:00.000000000 Z
11
+ date: 2016-04-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -70,14 +70,17 @@ files:
70
70
  - lib/mementus/depth_first_search.rb
71
71
  - lib/mementus/edge.rb
72
72
  - lib/mementus/graph.rb
73
- - lib/mementus/model.rb
74
73
  - lib/mementus/node.rb
75
74
  - lib/mementus/node_proxy.rb
75
+ - lib/mementus/query/source.rb
76
+ - lib/mementus/query/step.rb
77
+ - lib/mementus/query/traversal.rb
76
78
  - lib/mementus/relation.rb
77
79
  - lib/mementus/version.rb
78
80
  - mementus.gemspec
79
81
  - spec/graph_spec.rb
80
82
  - spec/node_proxy_spec.rb
83
+ - spec/query_spec.rb
81
84
  - spec/spec_helper.rb
82
85
  - spec/traversal_spec.rb
83
86
  homepage: https://github.com/maetl/mementus
@@ -107,6 +110,7 @@ summary: In-memory data model
107
110
  test_files:
108
111
  - spec/graph_spec.rb
109
112
  - spec/node_proxy_spec.rb
113
+ - spec/query_spec.rb
110
114
  - spec/spec_helper.rb
111
115
  - spec/traversal_spec.rb
112
116
  has_rdoc:
@@ -1,120 +0,0 @@
1
- require 'virtus'
2
- require 'axiom-memory-adapter'
3
-
4
- module Mementus
5
-
6
- # Proof of concept for a toy ORM that combines some aspects of the
7
- # ActiveRecord API with an in-memory query model based on the Axiom
8
- # relational algebra API.
9
- #
10
- class Model
11
-
12
- def self.inherited(concrete_model)
13
- concrete_model.send(:include, Virtus.model)
14
- concrete_model.send(:extend, Relation::ClassMethods)
15
- end
16
-
17
- @@local_storage = nil
18
- @@model_registry = {}
19
-
20
- def self.name_to_sym
21
- name_without_namespace = name.split("::").last
22
- name_without_namespace.gsub(/([^\^])([A-Z])/,'\1_\2').downcase.to_sym
23
- end
24
-
25
- # Unique cache identifier for this instance
26
- #
27
- def cache_key
28
- "#{self.class.name_to_sym.to_s}-#{object_id.to_s}"
29
- end
30
-
31
- # TODO: this mapping could be based on declared indexes,
32
- # rather than dumping the entire attribute schema here.
33
- #
34
- def schema_tuple
35
- tuple = [[:__cache_key, String]]
36
- attribute_set.each do |attribute_type|
37
- tuple << [attribute_type.name.to_sym, attribute_type.primitive]
38
- end
39
- tuple
40
- end
41
-
42
- # TODO: this mapping could be based on declared indexes,
43
- # rather than dumping the entire attribute data set here.
44
- #
45
- def values_tuple
46
- tuple = [cache_key]
47
- attributes.each do |_, attribute_value|
48
- tuple << attribute_value
49
- end
50
- tuple
51
- end
52
-
53
- # Create only writes to memory. It's required in order to
54
- # index the object's attributes in the query model.
55
- #
56
- def create
57
- ensure_registered(self)
58
- local_storage[self.class.name_to_sym].insert([values_tuple])
59
- self.class.cache_put(self.cache_key, self)
60
- end
61
-
62
- def ensure_registered(model)
63
- register(model) unless registered?(model)
64
- end
65
-
66
- def registered?(model)
67
- model_registry.has_key? model.class.name_to_sym
68
- end
69
-
70
- def register(model)
71
- model_id = model.class.name_to_sym
72
- model_registry[model_id] = true
73
- local_storage[model_id] = Axiom::Relation.new(model.schema_tuple)
74
- end
75
-
76
- def model_registry
77
- @@model_registry
78
- end
79
-
80
- def local_storage
81
- @@local_storage ||= Axiom::Adapter::Memory.new
82
- end
83
-
84
- def self.collection
85
- @@local_storage ||= Axiom::Adapter::Memory.new
86
-
87
- if @@local_storage.has_key?(name_to_sym)
88
- @@local_storage[name_to_sym]
89
- else
90
- Axiom::Relation.new(self.new.schema_tuple)
91
- end
92
- end
93
-
94
- # TODO: fix incomplete scope chaining
95
- def self.scope(name, conditions)
96
- if conditions.is_a? Hash
97
- scope_method = lambda { self.where(conditions) }
98
- elsif conditions.is_a? Proc
99
- scope_method = conditions
100
- end
101
-
102
- define_singleton_method(name, &scope_method)
103
- end
104
-
105
- private
106
-
107
- def self.cache
108
- @@cache ||= {}
109
- end
110
-
111
- def self.cache_put(cache_key, object)
112
- self.cache[cache_key] = object
113
- end
114
-
115
- def self.cache_get(cache_key)
116
- self.cache[cache_key]
117
- end
118
-
119
- end
120
- end