diff --git a/middleman-core/features/queryable.feature b/middleman-core/features/queryable.feature index b4a7294c..1382db3f 100644 --- a/middleman-core/features/queryable.feature +++ b/middleman-core/features/queryable.feature @@ -28,4 +28,8 @@ Feature: Queryable Selector Then should support ordering by attribute ascending Then should support ordering by attribute descending Then should order by attribute ascending by default - Then should exclude documents that do not own the attribute \ No newline at end of file + Then should exclude documents that do not own the attribute + Scenario: Passing queries around + Given a simple 'where' query + When I chain a where clause onto that query + Then the original query should remain unchanged diff --git a/middleman-core/features/step_definitions/queryable_steps.rb b/middleman-core/features/step_definitions/queryable_steps.rb index 788625ab..995c3d33 100644 --- a/middleman-core/features/step_definitions/queryable_steps.rb +++ b/middleman-core/features/step_definitions/queryable_steps.rb @@ -1,3 +1,15 @@ +Given /^a simple 'where' query$/ do + @query = Middleman::Sitemap::Queryable::Query.new({}).where(:foo => 'bar') +end + +When /^I chain a where clause onto that query$/ do + @new_query = @query.where(:baz => 'foo') +end + +Then /^the original query should remain unchanged$/ do + @query.opts({}).should_not eql @new_query.opts({}) +end + Then /^should initialize with an attribute and an operator$/ do selector = ::Middleman::Sitemap::Queryable::Selector.new :attribute => :author, :operator => 'equal' :author.should == selector.attribute @@ -120,4 +132,4 @@ end Then /^should exclude documents that do not own the attribute$/ do found_documents = @server_inst.sitemap.order_by(:status).all found_documents.map { |r| r.raw_data[:id] }.to_set.should == [1,2].to_set -end \ No newline at end of file +end diff --git a/middleman-core/lib/middleman-core/sitemap/queryable.rb b/middleman-core/lib/middleman-core/sitemap/queryable.rb index 0597bd22..59ce45ce 100644 --- a/middleman-core/lib/middleman-core/sitemap/queryable.rb +++ b/middleman-core/lib/middleman-core/sitemap/queryable.rb @@ -65,9 +65,12 @@ module Middleman end class Query - def initialize(model) + def initialize(model, opts={}) @model = model - @where = {} + @where = opts[:where] || {} + @order_by = opts[:order_by] + @offset = opts[:offset] + @limit = opts[:limit] end def where(constraints_hash) @@ -77,23 +80,27 @@ module Middleman selector = Selector.new(:attribute => attribute, :operator => 'equal') selector_hash.update({ selector => value }) end - @where.merge! selector_hash - self + Query.new @model, opts(:where => @where.merge(selector_hash)) + end + + def opts new_opts + { :where => {}.merge(@where), + :order_by => @order_by, + :offset => @offset, + :limit => @limit + }.merge(new_opts) end def order_by(field) - @order_by = field.is_a?(Symbol) ? {field => :asc} : field - self + Query.new @model, opts(:order_by => field.is_a?(Symbol) ? {field => :asc} : field) end def offset(number) - @offset = number - self + Query.new @model, opts(:offset => number) end def limit(number) - @limit = number - self + Query.new @model, opts(:limit => number) end def first @@ -145,4 +152,4 @@ class Symbol self.to_s <=> other.to_s end end -end \ No newline at end of file +end