mementus 0.2.3 → 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
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