mongoid_embed_finder 0.0.1 → 0.0.2

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: ecbb38b95a0203aecd5993d79c10dbb28ee06f5c
4
- data.tar.gz: 7fbf881de4a588a8676920cfb6625fc9e2699b10
3
+ metadata.gz: 60b96e46d3a830bd20085827c827774bc342fb0f
4
+ data.tar.gz: 2d9232aeb1e78e8d4710369f08ebe2acd5937ad8
5
5
  SHA512:
6
- metadata.gz: 6db36b453e52cb4b3343db6b3e19ac60e032eee512ef5c8811ca8b5a8af618e320d5e9b7454d3ee00b04471eac8f5c1aa6bb861bb1751ed5cc8b7adb0d03e98c
7
- data.tar.gz: beeaf658226886300e6b0f0ef5b6dd69f5634db2435fa4509cbcf842f92f09e8cd5f8092f948698f23d7a577ec05902d21ad4f71b9b5d813dcb1eb03d553925d
6
+ metadata.gz: 2bd177968c36476571030f5fd90e35389e9000957c957266962adfe4b6b876c83bb2ebcd991bc84ff681d976906ac2e025525e0ac370db29d9ebea700a1945b3
7
+ data.tar.gz: 52269e3d0f7a87c1541e7e9c47ae3ce07893e58eb16978b97a188a2b81eba92b697d25d22decc6e15d6bb17a0159628b612b81920bac319d403a378c5e51e066
@@ -0,0 +1,23 @@
1
+ module MongoidEmbedFinder
2
+ class NestedQuery
3
+ attr_reader :parent_criteria, :child_criteria
4
+
5
+ def initialize(parent_criteria, child_criteria)
6
+ @parent_criteria = parent_criteria
7
+ @child_criteria = child_criteria
8
+ end
9
+
10
+ def scope_parent(conditions = {})
11
+ @parent_criteria = @parent_criteria.where(conditions)
12
+ end
13
+
14
+ def scope_child(conditions = {})
15
+ @child_criteria = @child_criteria.where(conditions)
16
+ end
17
+
18
+ def execute
19
+ parent_criteria.collection
20
+ .find(parent_criteria.selector)
21
+ end
22
+ end
23
+ end
@@ -1,8 +1,13 @@
1
1
  module MongoidEmbedFinder
2
2
  module Projectors
3
- class Base < Struct.new(:relation, :criteria)
3
+ class Base < Struct.new(:query, :relation)
4
4
  def projection
5
- { relation.key => { operator => criteria.selector }}
5
+ { relation.key => { operator => query.child_criteria.selector }}
6
+ end
7
+
8
+ def project
9
+ query.scope_parent(projection)
10
+ query.execute.select(projection)
6
11
  end
7
12
 
8
13
  def operator
@@ -1,6 +1,6 @@
1
- require "mongoid_embed_finder/projectors/base"
2
- require "mongoid_embed_finder/projectors/single"
1
+ require "mongoid_embed_finder/nested_query"
3
2
  require "mongoid_embed_finder/nested_builder"
3
+ require "mongoid_embed_finder/projectors/single"
4
4
  require "mongoid_embed_finder/relation_discovery"
5
5
 
6
6
  module MongoidEmbedFinder
@@ -19,26 +19,22 @@ module MongoidEmbedFinder
19
19
  private
20
20
 
21
21
  def find_first(attrs = {}, parent: {})
22
- scope_parent(parent)
23
- project(attrs, with: Projectors::Single)
24
- execute_query.first
22
+ query = build_nested_query(attrs, parent: parent)
23
+ project_query(query, Projectors::Single).first
25
24
  end
26
25
 
27
- def scope_parent(attrs = {})
28
- @parent_criteria ||= relations.parent_class.criteria
29
- @parent_criteria.selector.merge!(attrs)
30
- end
26
+ def build_nested_query(attrs = {}, parent: {})
27
+ parent_criteria = relations.parent_class.criteria
28
+ child_criteria = relations.child_class.criteria
31
29
 
32
- def project(attrs = {}, with: Projectors::Base)
33
- child_criteria = relations.child_class.criteria.where(attrs)
34
- @projector = with.new(relations.children, child_criteria)
35
- scope_parent(@projector.projection)
30
+ NestedQuery.new(parent_criteria, child_criteria).tap do |query|
31
+ query.scope_parent(parent)
32
+ query.scope_child(attrs)
33
+ end
36
34
  end
37
35
 
38
- def execute_query
39
- relations.parent_class.collection
40
- .find(@parent_criteria.selector)
41
- .select(@projector.projection)
36
+ def project_query(query, projector_class)
37
+ projector_class.new(query, relations.children).project
42
38
  end
43
39
 
44
40
  def build_child_with_parent(nested_attrs)
@@ -1,3 +1,3 @@
1
1
  module MongoidEmbedFinder
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -3,10 +3,15 @@ require "mongoid_embed_finder/projectors/base"
3
3
 
4
4
  describe MongoidEmbedFinder::Projectors::Base do
5
5
  describe "#projection" do
6
+ let(:query) do
7
+ double(
8
+ scope_parent: nil,
9
+ execute: double(select: []),
10
+ child_criteria: double(selector: {}))
11
+ end
6
12
  let(:relation) { double(key: "children") }
7
- let(:criteria) { double(selector: { "name" => "Child Name 0" }) }
8
13
 
9
- subject { described_class.new(relation, criteria) }
14
+ subject { described_class.new(query, relation) }
10
15
 
11
16
  it "relies on methods to be implemented" do
12
17
  expect { subject.projection }.to raise_error(NotImplementedError)
@@ -2,12 +2,36 @@ require "spec_helper"
2
2
  require "mongoid_embed_finder/projectors/single"
3
3
 
4
4
  describe MongoidEmbedFinder::Projectors::Single do
5
- describe "#projection" do
6
- let(:relation) { double(key: "children") }
7
- let(:criteria) { double(selector: { "name" => "Child Name 0" }) }
5
+ let(:relation) { double(key: "children") }
6
+ let(:criteria) { double(selector: { "name" => "Child Name 0" }) }
7
+ let(:projection_result) { [] }
8
+ let(:query) do
9
+ double(
10
+ scope_parent: nil,
11
+ execute: double(select: projection_result),
12
+ child_criteria: criteria)
13
+ end
8
14
 
9
- subject { described_class.new(relation, criteria) }
15
+ subject { described_class.new(query, relation) }
10
16
 
17
+ describe "#projection" do
11
18
  its(:projection) { should eq(relation.key => { "$elemMatch" => criteria.selector }) }
12
19
  end
20
+
21
+ describe "#project" do
22
+ it "extend parent's criteria" do
23
+ subject.project
24
+ expect(query).to have_received(:scope_parent).with(subject.projection)
25
+ end
26
+
27
+ it "projects query" do
28
+ subject.project
29
+ expect(query).to have_received(:execute)
30
+ expect(query.execute).to have_received(:select).with(subject.projection)
31
+ end
32
+
33
+ it "returns projection result" do
34
+ expect(subject.project).to eq projection_result
35
+ end
36
+ end
13
37
  end
@@ -3,14 +3,14 @@ require "mongoid_embed_finder/relation_discovery"
3
3
 
4
4
  describe MongoidEmbedFinder::RelationDiscovery do
5
5
  describe "#relations" do
6
- subject { described_class.new(Child, :parent).relations }
6
+ subject { described_class.new(Door, :car).relations }
7
7
 
8
- its(:child_class) { should eq Child }
9
- its(:parent_class) { should eq Parent }
8
+ its(:child_class) { should eq Door }
9
+ its(:parent_class) { should eq Car }
10
10
 
11
- its('children.key') { should eq "children" }
12
- its('children.class_name') { should eq "Child" }
11
+ its('children.key') { should eq "doors" }
12
+ its('children.class_name') { should eq "Door" }
13
13
 
14
- its('parent.setter') { should eq "parent=" }
14
+ its('parent.setter') { should eq "car=" }
15
15
  end
16
16
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mongoid_embed_finder
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Artur Hebda
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-05-19 00:00:00.000000000 Z
11
+ date: 2014-05-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: mongoid
@@ -112,6 +112,7 @@ files:
112
112
  - Rakefile
113
113
  - lib/mongoid_embed_finder.rb
114
114
  - lib/mongoid_embed_finder/nested_builder.rb
115
+ - lib/mongoid_embed_finder/nested_query.rb
115
116
  - lib/mongoid_embed_finder/projectors/base.rb
116
117
  - lib/mongoid_embed_finder/projectors/single.rb
117
118
  - lib/mongoid_embed_finder/relation_discovery.rb
@@ -119,7 +120,6 @@ files:
119
120
  - lib/mongoid_embed_finder/version.rb
120
121
  - mongoid_embed_finder.gemspec
121
122
  - spec/mongoid_embed_finder/nested_builder_spec.rb
122
- - spec/mongoid_embed_finder/projector_spec.rb
123
123
  - spec/mongoid_embed_finder/projectors/base_spec.rb
124
124
  - spec/mongoid_embed_finder/projectors/single_spec.rb
125
125
  - spec/mongoid_embed_finder/relation_discovery_spec.rb
@@ -151,7 +151,6 @@ specification_version: 4
151
151
  summary: Find mongoid embedded documents easily.
152
152
  test_files:
153
153
  - spec/mongoid_embed_finder/nested_builder_spec.rb
154
- - spec/mongoid_embed_finder/projector_spec.rb
155
154
  - spec/mongoid_embed_finder/projectors/base_spec.rb
156
155
  - spec/mongoid_embed_finder/projectors/single_spec.rb
157
156
  - spec/mongoid_embed_finder/relation_discovery_spec.rb
@@ -1,15 +0,0 @@
1
- require "spec_helper"
2
- require "mongoid_embed_finder/projector"
3
-
4
- describe MongoidEmbedFinder::Projector do
5
- describe "#to_projection" do
6
- let(:relation) { double(key: "children") }
7
- let(:criteria) { double(selector: { "name" => "Child Name 0" }) }
8
-
9
- subject { described_class.new(relation, criteria) }
10
-
11
- it "needs to be implemented in derived classes" do
12
- expect { subject.to_projection }.to raise_error(NotImplementedError)
13
- end
14
- end
15
- end