From c94fc1a381b3492677e13f1961e181e4740f8ee9 Mon Sep 17 00:00:00 2001 From: chenzww Date: Fri, 9 Jun 2017 21:49:28 +0800 Subject: [PATCH 1/3] Add pass document parameter to unwind method support since new specification in MongoDB version 3.2. --- lib/mongoid/criteria/queryable/pipeline.rb | 16 +++++++++++++--- spec/mongoid/criteria/queryable/pipeline_spec.rb | 14 ++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/lib/mongoid/criteria/queryable/pipeline.rb b/lib/mongoid/criteria/queryable/pipeline.rb index 38ba581930..b33e001eb8 100644 --- a/lib/mongoid/criteria/queryable/pipeline.rb +++ b/lib/mongoid/criteria/queryable/pipeline.rb @@ -72,16 +72,26 @@ def project(entry) # # @example Add the unwind. # pipeline.unwind(:field) + # pipeline.unwind(document) + # + # @see https://docs.mongodb.com/manual/reference/operator/aggregation/unwind/ # # @param [ String, Symbol ] field The name of the field. + # @param [ Hash ] document. # # @return [ Pipeline ] The pipeline. # # @since 2.0.0 def unwind(field) - normalized = field.to_s - name = aliases[normalized] || normalized - push("$unwind" => name.__mongo_expression__) + unless field.respond_to? :keys + normalized = field.to_s + name = aliases[normalized] || normalized + push("$unwind" => name.__mongo_expression__) + else + permit_keys = ['path', 'includeArrayIndex', 'preserveNullAndEmptyArrays'].freeze + normalized = BSON::Document.new(field.select { |k| permit_keys.include?(k.to_s) }) + push("$unwind" => normalized) + end end private diff --git a/spec/mongoid/criteria/queryable/pipeline_spec.rb b/spec/mongoid/criteria/queryable/pipeline_spec.rb index a9acb2e99c..c1fdb33262 100644 --- a/spec/mongoid/criteria/queryable/pipeline_spec.rb +++ b/spec/mongoid/criteria/queryable/pipeline_spec.rb @@ -196,5 +196,19 @@ end end end + + context "when provided a hash value" do + context "unnecessary keys should be removed" do + before do + pipeline.unwind(path: "$foo", "includeArrayIndex" => "index", preserveNullAndEmptyArrays: true, foo: "bar") + end + + it "only reserve permit keys" do + expect(pipeline).to eq([ + { "$unwind" => { "path" => "$foo", "includeArrayIndex" => "index", "preserveNullAndEmptyArrays" => true } } + ]) + end + end + end end end From 9bff40d3438af67e6c84f0e2859af5bee9d4e3a8 Mon Sep 17 00:00:00 2001 From: chenzww Date: Sat, 10 Jun 2017 16:07:43 +0800 Subject: [PATCH 2/3] Remove unnecessary key check when pass a document parameter. --- lib/mongoid/criteria/queryable/pipeline.rb | 10 ++++------ .../criteria/queryable/pipeline_spec.rb | 18 ++++++++---------- 2 files changed, 12 insertions(+), 16 deletions(-) diff --git a/lib/mongoid/criteria/queryable/pipeline.rb b/lib/mongoid/criteria/queryable/pipeline.rb index b33e001eb8..8e57846749 100644 --- a/lib/mongoid/criteria/queryable/pipeline.rb +++ b/lib/mongoid/criteria/queryable/pipeline.rb @@ -82,15 +82,13 @@ def project(entry) # @return [ Pipeline ] The pipeline. # # @since 2.0.0 - def unwind(field) - unless field.respond_to? :keys - normalized = field.to_s + def unwind(field_or_doc) + unless field_or_doc.respond_to? :keys + normalized = field_or_doc.to_s name = aliases[normalized] || normalized push("$unwind" => name.__mongo_expression__) else - permit_keys = ['path', 'includeArrayIndex', 'preserveNullAndEmptyArrays'].freeze - normalized = BSON::Document.new(field.select { |k| permit_keys.include?(k.to_s) }) - push("$unwind" => normalized) + push("$unwind" => field_or_doc) end end diff --git a/spec/mongoid/criteria/queryable/pipeline_spec.rb b/spec/mongoid/criteria/queryable/pipeline_spec.rb index c1fdb33262..fdcd6b72a9 100644 --- a/spec/mongoid/criteria/queryable/pipeline_spec.rb +++ b/spec/mongoid/criteria/queryable/pipeline_spec.rb @@ -197,17 +197,15 @@ end end - context "when provided a hash value" do - context "unnecessary keys should be removed" do - before do - pipeline.unwind(path: "$foo", "includeArrayIndex" => "index", preserveNullAndEmptyArrays: true, foo: "bar") - end + context "when provided a hash" do + before do + pipeline.unwind(path: "$author", "includeArrayIndex" => "author_index", preserveNullAndEmptyArrays: true) + end - it "only reserve permit keys" do - expect(pipeline).to eq([ - { "$unwind" => { "path" => "$foo", "includeArrayIndex" => "index", "preserveNullAndEmptyArrays" => true } } - ]) - end + it "sets the hash" do + expect(pipeline).to eq([ + { "$unwind" => { path: "$author", "includeArrayIndex" => "author_index", preserveNullAndEmptyArrays: true } } + ]) end end end From dc47d13563e095d25033bd0f6b504933ff082ff8 Mon Sep 17 00:00:00 2001 From: chenzww Date: Wed, 14 Jun 2017 23:38:52 +0800 Subject: [PATCH 3/3] Update the documentation of unwind pipeline method. --- lib/mongoid/criteria/queryable/pipeline.rb | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/lib/mongoid/criteria/queryable/pipeline.rb b/lib/mongoid/criteria/queryable/pipeline.rb index 8e57846749..4d49b76f37 100644 --- a/lib/mongoid/criteria/queryable/pipeline.rb +++ b/lib/mongoid/criteria/queryable/pipeline.rb @@ -74,10 +74,7 @@ def project(entry) # pipeline.unwind(:field) # pipeline.unwind(document) # - # @see https://docs.mongodb.com/manual/reference/operator/aggregation/unwind/ - # - # @param [ String, Symbol ] field The name of the field. - # @param [ Hash ] document. + # @param [ String, Symbol, Hash ] field_or_doc The name of the field or a document. # # @return [ Pipeline ] The pipeline. #