lib/mongo/query.rb in mongo-0.1.0 vs lib/mongo/query.rb in mongo-0.15
- old
+ new
@@ -1,110 +1,118 @@
# --
# Copyright (C) 2008-2009 10gen Inc.
#
-# This program is free software: you can redistribute it and/or modify it
-# under the terms of the GNU Affero General Public License, version 3, as
-# published by the Free Software Foundation.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
#
-# This program is distributed in the hope that it will be useful, but WITHOUT
-# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License
-# for more details.
+# http://www.apache.org/licenses/LICENSE-2.0
#
-# You should have received a copy of the GNU Affero General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
# ++
require 'mongo/collection'
require 'mongo/message'
+require 'mongo/types/code'
-module XGen
- module Mongo
- module Driver
+module Mongo
- # A query against a collection. A query's selector is a hash. See the
- # Mongo documentation for query details.
- class Query
+ # A query against a collection. A query's selector is a hash. See the
+ # Mongo documentation for query details.
+ class Query
- attr_accessor :number_to_skip, :number_to_return, :order_by
- # If true, $explain will be set in QueryMessage that uses this query.
- attr_accessor :explain
- # Either +nil+ or an array of hint field names.
- attr_accessor :hint_fields
- attr_reader :selector # writer defined below
+ attr_accessor :number_to_skip, :number_to_return, :order_by, :snapshot
+ # If true, $explain will be set in QueryMessage that uses this query.
+ attr_accessor :explain
+ # Either +nil+ or a hash (preferably an OrderedHash).
+ attr_accessor :hint
+ attr_reader :selector # writer defined below
- # sel :: A hash describing the query. See the Mongo docs for details.
- #
- # return_fields :: If not +nil+, a single field name or an array of
- # field names. Only those fields will be returned.
- # (Called :fields in calls to Collection#find.)
- #
- # number_to_skip :: Number of records to skip before returning
- # records. (Called :offset in calls to
- # Collection#find.) Default is 0.
- #
- # number_to_return :: Max number of records to return. (Called :limit
- # in calls to Collection#find.) Default is 0 (all
- # records).
- #
- # order_by :: If not +nil+, specifies record sort order. May be a
- # String, Hash, OrderedHash, or Array. If a string, the
- # results will be ordered by that field in ascending
- # order. If an array, it should be an array of field names
- # which will all be sorted in ascending order. If a hash,
- # it may be either a regular Hash or an OrderedHash. The
- # keys should be field names, and the values should be 1
- # (ascending) or -1 (descending). Note that if it is a
- # regular Hash then sorting by more than one field
- # probably will not be what you intend because key order
- # is not preserved. (order_by is called :sort in calls to
- # Collection#find.)
- def initialize(sel={}, return_fields=nil, number_to_skip=0, number_to_return=0, order_by=nil)
- @number_to_skip, @number_to_return, @order_by = number_to_skip, number_to_return, order_by
- self.selector = sel
- self.fields = return_fields
- end
+ # sel :: A hash describing the query. See the Mongo docs for details.
+ #
+ # return_fields :: If not +nil+, a single field name or an array of
+ # field names. Only those fields will be returned.
+ # (Called :fields in calls to Collection#find.)
+ #
+ # number_to_skip :: Number of records to skip before returning
+ # records. Default is 0.
+ #
+ # number_to_return :: Max number of records to return. (Called :limit
+ # in calls to Collection#find.) Default is 0 (all
+ # records).
+ #
+ # order_by :: If not +nil+, specifies record sort order. May be a
+ # String, Hash, OrderedHash, or Array. If a string, the
+ # results will be ordered by that field in ascending
+ # order. If an array, it should be an array of field names
+ # which will all be sorted in ascending order. If a hash,
+ # it may be either a regular Hash or an OrderedHash. The
+ # keys should be field names, and the values should be 1
+ # (ascending) or -1 (descending). Note that if it is a
+ # regular Hash then sorting by more than one field
+ # probably will not be what you intend because key order
+ # is not preserved. (order_by is called :sort in calls to
+ # Collection#find.)
+ #
+ # hint :: If not +nil+, specifies query hint fields. Must be either
+ # +nil+ or a hash (preferably an OrderedHash). See
+ # Collection#hint.
+ def initialize(sel={}, return_fields=nil, number_to_skip=0, number_to_return=0, order_by=nil, hint=nil, snapshot=nil)
+ @number_to_skip, @number_to_return, @order_by, @hint, @snapshot =
+ number_to_skip, number_to_return, order_by, hint, snapshot
+ @explain = nil
+ self.selector = sel
+ self.fields = return_fields
+ end
- # Set query selector hash. If sel is a string, it will be used as a
- # $where clause. (See Mongo docs for details.)
- def selector=(sel)
- @selector = case sel
- when nil
- {}
- when String
- {"$where" => sel}
- when Hash
- sel
- end
- end
+ # Set query selector hash. If sel is Code/string, it will be used as a
+ # $where clause. (See Mongo docs for details.)
+ def selector=(sel)
+ @selector = case sel
+ when nil
+ {}
+ when Code
+ {"$where" => sel}
+ when String
+ {"$where" => Code.new(sel)}
+ when Hash
+ sel
+ end
+ end
- # Set fields to return. If +val+ is +nil+ or empty, all fields will be
- # returned.
- def fields=(val)
- @fields = val
- @fields = nil if @fields && @fields.empty?
- end
+ # Set fields to return. If +val+ is +nil+ or empty, all fields will be
+ # returned.
+ def fields=(val)
+ @fields = val
+ @fields = nil if @fields && @fields.empty?
+ end
- def fields
- case @fields
- when String
- {@fields => 1}
- when Array
- if @fields.length == 0
- nil
- else
- h = {}
- @fields.each { |field| h[field] = 1 }
- h
- end
- else # nil, anything else
- nil
- end
+ def fields
+ case @fields
+ when String
+ {@fields => 1}
+ when Array
+ if @fields.length == 0
+ nil
+ else
+ h = {}
+ @fields.each { |field| h[field] = 1 }
+ h
end
-
- def contains_special_fields
- (@order_by != nil && @order_by.length > 0) || @explain || @hint_fields
- end
+ else # nil, anything else
+ nil
end
+ end
+
+ def contains_special_fields
+ (@order_by != nil && @order_by.length > 0) || @explain || @hint || @snapshot
+ end
+
+ def to_s
+ "find(#{@selector.inspect})" + (@order_by ? ".sort(#{@order_by.inspect})" : "")
end
end
end