mongoid_geospatial 1.0.0rc0
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +5 -0
- data/.gitignore +49 -0
- data/.rspec +1 -0
- data/Gemfile +11 -0
- data/README.md +330 -0
- data/Rakefile +18 -0
- data/lib/mongoid_geospatial/contexts/mongo.rb +115 -0
- data/lib/mongoid_geospatial/criteria.rb +5 -0
- data/lib/mongoid_geospatial/criterion/complex.rb +19 -0
- data/lib/mongoid_geospatial/criterion/inclusion.rb +14 -0
- data/lib/mongoid_geospatial/criterion/near_spatial.rb +50 -0
- data/lib/mongoid_geospatial/criterion/within_spatial.rb +60 -0
- data/lib/mongoid_geospatial/criterion.rb +3 -0
- data/lib/mongoid_geospatial/extensions/hash.rb +22 -0
- data/lib/mongoid_geospatial/extensions/symbol.rb +46 -0
- data/lib/mongoid_geospatial/field_option.rb +16 -0
- data/lib/mongoid_geospatial/fields/line_string.rb +18 -0
- data/lib/mongoid_geospatial/fields/point.rb +51 -0
- data/lib/mongoid_geospatial/fields/polygon.rb +22 -0
- data/lib/mongoid_geospatial/finders.rb +5 -0
- data/lib/mongoid_geospatial/geospatial/core_ext.rb +27 -0
- data/lib/mongoid_geospatial/geospatial/geo_near_results.rb +140 -0
- data/lib/mongoid_geospatial/geospatial.rb +86 -0
- data/lib/mongoid_geospatial/version.rb +5 -0
- data/lib/mongoid_geospatial.rb +16 -0
- data/mongoid_geospatial.gemspec +28 -0
- data/spec/config/mongod.conf +3 -0
- data/spec/config/mongoid.yml +18 -0
- data/spec/functional/contexts/mongo_spec.rb +127 -0
- data/spec/functional/criterion/inclusion_spec.rb +356 -0
- data/spec/functional/mongoid_geospatial_spec.rb +54 -0
- data/spec/functional/spatial/geo_near_results_spec.rb +78 -0
- data/spec/models/account.rb +19 -0
- data/spec/models/acolyte.rb +9 -0
- data/spec/models/address.rb +62 -0
- data/spec/models/address_component.rb +5 -0
- data/spec/models/agent.rb +10 -0
- data/spec/models/alert.rb +5 -0
- data/spec/models/animal.rb +21 -0
- data/spec/models/answer.rb +4 -0
- data/spec/models/bar.rb +9 -0
- data/spec/models/birthday.rb +13 -0
- data/spec/models/book.rb +5 -0
- data/spec/models/business.rb +7 -0
- data/spec/models/callbacks.rb +57 -0
- data/spec/models/category.rb +13 -0
- data/spec/models/circus.rb +7 -0
- data/spec/models/comment.rb +13 -0
- data/spec/models/country_code.rb +6 -0
- data/spec/models/description.rb +11 -0
- data/spec/models/division.rb +5 -0
- data/spec/models/drug.rb +5 -0
- data/spec/models/employer.rb +5 -0
- data/spec/models/entry.rb +6 -0
- data/spec/models/event.rb +20 -0
- data/spec/models/farm.rb +10 -0
- data/spec/models/favorite.rb +6 -0
- data/spec/models/fruits.rb +11 -0
- data/spec/models/game.rb +18 -0
- data/spec/models/ghost.rb +7 -0
- data/spec/models/house.rb +4 -0
- data/spec/models/inheritance.rb +90 -0
- data/spec/models/league.rb +5 -0
- data/spec/models/location.rb +5 -0
- data/spec/models/login.rb +6 -0
- data/spec/models/membership.rb +4 -0
- data/spec/models/mixed_drink.rb +4 -0
- data/spec/models/name.rb +13 -0
- data/spec/models/namespacing.rb +11 -0
- data/spec/models/observed.rb +41 -0
- data/spec/models/override.rb +16 -0
- data/spec/models/owner.rb +6 -0
- data/spec/models/page.rb +5 -0
- data/spec/models/page_question.rb +4 -0
- data/spec/models/paranoid_post.rb +18 -0
- data/spec/models/parents.rb +32 -0
- data/spec/models/patient.rb +15 -0
- data/spec/models/person.rb +146 -0
- data/spec/models/pet.rb +7 -0
- data/spec/models/pet_owner.rb +6 -0
- data/spec/models/phone.rb +7 -0
- data/spec/models/player.rb +23 -0
- data/spec/models/post.rb +26 -0
- data/spec/models/preference.rb +9 -0
- data/spec/models/question.rb +8 -0
- data/spec/models/quiz.rb +6 -0
- data/spec/models/rating.rb +8 -0
- data/spec/models/river.rb +20 -0
- data/spec/models/role.rb +5 -0
- data/spec/models/service.rb +6 -0
- data/spec/models/shelf.rb +5 -0
- data/spec/models/slave_address_numbers.rb +14 -0
- data/spec/models/survey.rb +5 -0
- data/spec/models/tag.rb +6 -0
- data/spec/models/tracking_id_validation_history.rb +25 -0
- data/spec/models/translation.rb +5 -0
- data/spec/models/tree.rb +9 -0
- data/spec/models/user.rb +9 -0
- data/spec/models/user_account.rb +10 -0
- data/spec/models/vet_visit.rb +5 -0
- data/spec/models/video.rb +9 -0
- data/spec/models/wiki_page.rb +6 -0
- data/spec/spec_helper.rb +51 -0
- data/spec/support/authentication.rb +29 -0
- data/spec/unit/criterion/complex_spec.rb +15 -0
- data/spec/unit/criterion/inclusion_spec.rb +0 -0
- data/spec/unit/criterion/near_spatial_spec.rb +39 -0
- data/spec/unit/criterion/within_spatial_spec.rb +52 -0
- metadata +339 -0
@@ -0,0 +1,23 @@
|
|
1
|
+
class Player
|
2
|
+
include Mongoid::Document
|
3
|
+
field :active, :type => Boolean
|
4
|
+
field :frags, :type => Integer
|
5
|
+
field :deaths, :type => Integer
|
6
|
+
field :status
|
7
|
+
|
8
|
+
named_scope :active, criteria.where(:active => true) do
|
9
|
+
def extension
|
10
|
+
"extension"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
named_scope :inactive, :where => { :active => false }
|
14
|
+
named_scope :frags_over, lambda { |count| { :where => { :frags.gt => count } } }
|
15
|
+
named_scope :deaths_under, lambda { |count| criteria.where(:deaths.lt => count) }
|
16
|
+
scope :deaths_over, lambda { |count| criteria.where(:deaths.gt => count) }
|
17
|
+
|
18
|
+
class << self
|
19
|
+
def alive
|
20
|
+
criteria.where(:status => "Alive")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/spec/models/post.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
class Post
|
2
|
+
include Mongoid::Document
|
3
|
+
include Mongoid::MultiParameterAttributes
|
4
|
+
include Mongoid::Versioning
|
5
|
+
include Mongoid::Timestamps
|
6
|
+
|
7
|
+
field :title, :type => String
|
8
|
+
field :content, :type => String
|
9
|
+
field :rating, :type => Integer
|
10
|
+
|
11
|
+
belongs_to :person
|
12
|
+
belongs_to :author, :foreign_key => :author_id, :class_name => "User"
|
13
|
+
has_and_belongs_to_many :tags
|
14
|
+
has_many :videos, :validate => false
|
15
|
+
|
16
|
+
scope :recent, where(:created_at => { "$lt" => Time.now, "$gt" => 30.days.ago })
|
17
|
+
scope :posting, where(:content.in => [ "Posting" ])
|
18
|
+
|
19
|
+
validates_format_of :title, :without => /\$\$\$/
|
20
|
+
|
21
|
+
class << self
|
22
|
+
def old
|
23
|
+
where(:created_at => { "$lt" => 30.days.ago })
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,9 @@
|
|
1
|
+
class Preference
|
2
|
+
include Mongoid::Document
|
3
|
+
field :name, :type => String
|
4
|
+
field :value, :type => String
|
5
|
+
field :ranking, :type => Integer
|
6
|
+
has_and_belongs_to_many :people
|
7
|
+
validates_length_of :name, :minimum => 2, :allow_nil => true
|
8
|
+
scope :posting, where(:value.in => [ "Posting" ])
|
9
|
+
end
|
data/spec/models/quiz.rb
ADDED
@@ -0,0 +1,8 @@
|
|
1
|
+
class Rating
|
2
|
+
include Mongoid::Document
|
3
|
+
field :value, :type => Integer
|
4
|
+
referenced_in :ratable, :polymorphic => true
|
5
|
+
references_many :comments
|
6
|
+
validates_numericality_of :value, :less_than => 100, :allow_nil => true
|
7
|
+
validates :ratable, :associated => true
|
8
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
class River
|
2
|
+
include Mongoid::Document
|
3
|
+
include Mongoid::Geospatial
|
4
|
+
|
5
|
+
field :name, type: String
|
6
|
+
field :length, type: Integer
|
7
|
+
field :average_discharge, type: Integer
|
8
|
+
field :source, type: Array, spatial: true
|
9
|
+
# set return_array to true if you do not want a hash returned all the time
|
10
|
+
field :mouth, type: Array, spatial: {lat: 'latitude', lng: 'longitude'}
|
11
|
+
field :mouth_array, type: Array, spatial: {return_array: true}
|
12
|
+
|
13
|
+
# simplified spatial indexing
|
14
|
+
# you can only index one field in mongodb < 1.9
|
15
|
+
spatial_index :source
|
16
|
+
# alternatives
|
17
|
+
# index [[ :spatial, Mongo::GEO2D ]], {min:-400, max:400}
|
18
|
+
# index [[ :spatial, Mongo::GEO2D ]], {bit:32}
|
19
|
+
# index [[ :spatial, Mongo::GEO2D ],:name]
|
20
|
+
end
|
data/spec/models/role.rb
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
# These models used for Github 263
|
2
|
+
class Slave
|
3
|
+
include Mongoid::Document
|
4
|
+
field :first_name
|
5
|
+
field :last_name
|
6
|
+
embeds_many :address_numbers
|
7
|
+
end
|
8
|
+
|
9
|
+
class AddressNumber
|
10
|
+
include Mongoid::Document
|
11
|
+
field :country_code, :type => Integer, :default => 1
|
12
|
+
field :number
|
13
|
+
embedded_in :slave
|
14
|
+
end
|
data/spec/models/tag.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
# These models are spcific to test for Github #313.
|
2
|
+
module MyCompany
|
3
|
+
module Model
|
4
|
+
class TrackingId
|
5
|
+
include Mongoid::Document
|
6
|
+
include Mongoid::Timestamps
|
7
|
+
store_in :tracking_ids
|
8
|
+
embeds_many :validation_history, :class_name => "MyCompany::Model::TrackingIdValidationHistory"
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
module MyCompany
|
14
|
+
module Model
|
15
|
+
# A TrackingId validation state change
|
16
|
+
class TrackingIdValidationHistory
|
17
|
+
include Mongoid::Document
|
18
|
+
field :old_state, :type => String
|
19
|
+
field :new_state, :type => String
|
20
|
+
field :when_changed, :type => DateTime
|
21
|
+
attr_protected :_id
|
22
|
+
embedded_in :tracking_id, :class_name => "MyCompany::Model::TrackingId"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/spec/models/tree.rb
ADDED
data/spec/models/user.rb
ADDED
@@ -0,0 +1,10 @@
|
|
1
|
+
class UserAccount
|
2
|
+
include Mongoid::Document
|
3
|
+
field :username
|
4
|
+
field :name
|
5
|
+
field :email
|
6
|
+
validates_uniqueness_of :username, :message => "is not unique"
|
7
|
+
validates_uniqueness_of :email, :message => "is not unique", :case_sensitive => false
|
8
|
+
validates_length_of :name, :minimum => 2, :allow_nil => true
|
9
|
+
references_and_referenced_in_many :people
|
10
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
require 'pry'
|
2
|
+
$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
3
|
+
$LOAD_PATH.unshift(File.dirname(__FILE__))
|
4
|
+
|
5
|
+
MODELS = File.join(File.dirname(__FILE__), "models")
|
6
|
+
SUPPORT = File.join(File.dirname(__FILE__), "support")
|
7
|
+
$LOAD_PATH.unshift(MODELS)
|
8
|
+
$LOAD_PATH.unshift(SUPPORT)
|
9
|
+
|
10
|
+
require "mongoid"
|
11
|
+
require "mocha"
|
12
|
+
require "rspec"
|
13
|
+
require "mongoid_geospatial"
|
14
|
+
|
15
|
+
LOGGER = Logger.new($stdout)
|
16
|
+
|
17
|
+
if RUBY_VERSION >= '1.9.2'
|
18
|
+
YAML::ENGINE.yamler = 'syck'
|
19
|
+
end
|
20
|
+
|
21
|
+
Mongoid.configure do |config|
|
22
|
+
name = "mongoid_geospatial_test"
|
23
|
+
config.master = Mongo::Connection.new.db(name)
|
24
|
+
config.logger = nil
|
25
|
+
config.allow_dynamic_fields = true
|
26
|
+
end
|
27
|
+
|
28
|
+
Dir[ File.join(MODELS, "*.rb") ].sort.each { |file| require File.basename(file) }
|
29
|
+
Dir[ File.join(SUPPORT, "*.rb") ].each { |file| require File.basename(file) }
|
30
|
+
|
31
|
+
RSpec.configure do |config|
|
32
|
+
config.mock_with(:mocha)
|
33
|
+
|
34
|
+
config.after(:suite) { Mongoid.purge! }
|
35
|
+
config.after(:each) do
|
36
|
+
Mongoid.database.collections.each do |collection|
|
37
|
+
unless collection.name =~ /^system\./
|
38
|
+
collection.remove
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# We filter out the specs that require authentication if the database has not
|
44
|
+
# had the mongoid user set up properly.
|
45
|
+
user_configured = Support::Authentication.configured?
|
46
|
+
warn(Support::Authentication.message) unless user_configured
|
47
|
+
|
48
|
+
config.filter_run_excluding(:config => lambda { |value|
|
49
|
+
return true if value == :user && !user_configured
|
50
|
+
})
|
51
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
module Support #:nodoc:
|
3
|
+
module Authentication
|
4
|
+
extend self
|
5
|
+
|
6
|
+
def configured?
|
7
|
+
begin
|
8
|
+
master_uri = "mongodb://mongoid:test@localhost:27017/mongoid_geospatial_test"
|
9
|
+
Mongo::Connection.from_uri(master_uri)
|
10
|
+
true
|
11
|
+
rescue Mongo::AuthenticationError => e
|
12
|
+
false
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def message
|
17
|
+
%Q{
|
18
|
+
---------------------------------------------------------------------
|
19
|
+
A user needs to be configured for authentication, otherwise some
|
20
|
+
configuration specs will not get run. You may set it up from the
|
21
|
+
mongo console:
|
22
|
+
|
23
|
+
$ use mongoid_geospatial_test;
|
24
|
+
$ db.addUser("mongoid", "test");
|
25
|
+
---------------------------------------------------------------------
|
26
|
+
}
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Mongoid::Criterion::Complex do
|
4
|
+
|
5
|
+
let(:complex) { Mongoid::Criterion::Complex.new(:key => :field, :operator => "gt") }
|
6
|
+
|
7
|
+
let(:value) { 40 }
|
8
|
+
|
9
|
+
context "#to_mongo_query" do
|
10
|
+
it "should turn value into appropriate query" do
|
11
|
+
complex.to_mongo_query(value).should == {"$gt" => value}
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
File without changes
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Mongoid::Criterion::NearSpatial do
|
4
|
+
|
5
|
+
let(:within) do
|
6
|
+
{
|
7
|
+
:flat => Mongoid::Criterion::WithinSpatial.new(:key => :field, :operator => "near"),
|
8
|
+
:sphere => Mongoid::Criterion::WithinSpatial.new(:key => :field, :operator => "nearSphere"),
|
9
|
+
}
|
10
|
+
end
|
11
|
+
NEAR = {
|
12
|
+
:flat =>
|
13
|
+
{
|
14
|
+
'Point' => [[1,2],5],
|
15
|
+
'Hash Point' => {:point => [-73.98, 40.77], :max => 5},
|
16
|
+
'Hash Point Unit' => {:point => [-73.98, 40.77], :max => 5, :unit => :km}
|
17
|
+
},
|
18
|
+
:sphere =>
|
19
|
+
{
|
20
|
+
'Point' => [[1,2],5],
|
21
|
+
'Hash Point' => {:point => [-73.98, 40.77], :max => 5},
|
22
|
+
'Hash Point Unit' => {:point => [-73.98, 40.77], :max => 5, :unit => :km}
|
23
|
+
}
|
24
|
+
}
|
25
|
+
|
26
|
+
context "#to_mongo_query" do
|
27
|
+
|
28
|
+
NEAR.each do |shape, points|
|
29
|
+
points.each do |input_name,input|
|
30
|
+
it "#{shape} should generate a query with #{input_name}" do
|
31
|
+
within[shape].to_mongo_query(input).should be_a_kind_of(Hash)
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe Mongoid::Criterion::WithinSpatial do
|
4
|
+
|
5
|
+
let(:within) do
|
6
|
+
{
|
7
|
+
:box => Mongoid::Criterion::WithinSpatial.new(:key => :field, :operator => "box"),
|
8
|
+
:polygon => Mongoid::Criterion::WithinSpatial.new(:key => :field, :operator => "polygon"),
|
9
|
+
:center => Mongoid::Criterion::WithinSpatial.new(:key => :field, :operator => "center"),
|
10
|
+
:center_sphere => Mongoid::Criterion::WithinSpatial.new(:key => :field, :operator => "box"),
|
11
|
+
}
|
12
|
+
end
|
13
|
+
WITHIN = {
|
14
|
+
:box =>
|
15
|
+
{
|
16
|
+
'Array of Arrays' => [[10,20], [15,25]],
|
17
|
+
'Array of Hashes' => [{ x: 10, y: 20 }, { x: 15, y: 25 }],
|
18
|
+
'Hash of Hashes' => { a: { x: 10, y: 20 }, b: { x: 15, y: 25 }}
|
19
|
+
},
|
20
|
+
:polygon =>
|
21
|
+
{
|
22
|
+
'Array of Arrays' => [[10,20], [15,25]],
|
23
|
+
'Array of Hashes' => [{ x: 10, y: 20 }, { x: 15, y: 25 }],
|
24
|
+
'Hash of Hashes' => { a: { x: 10, y: 20 }, b: { x: 15, y: 25 }}
|
25
|
+
},
|
26
|
+
:center =>
|
27
|
+
{
|
28
|
+
'Point' => [[1,2],5],
|
29
|
+
'Hash Point' => {:point => [-73.98, 40.77], :max => 5},
|
30
|
+
'Hash Point Unit' => {:point => [-73.98, 40.77], :max => 5, :unit => :km}
|
31
|
+
},
|
32
|
+
:center_sphere =>
|
33
|
+
{
|
34
|
+
'Point' => [[1,2],5],
|
35
|
+
'Hash Point' => {:point => [-73.98, 40.77], :max => 5},
|
36
|
+
'Hash Point Unit' => {:point => [-73.98, 40.77], :max => 5, :unit => :km}
|
37
|
+
}
|
38
|
+
}
|
39
|
+
|
40
|
+
context "#to_mongo_query" do
|
41
|
+
|
42
|
+
WITHIN.each do |shape, points|
|
43
|
+
points.each do |input_name,input|
|
44
|
+
it "#{shape} should generate a query with #{input_name}" do
|
45
|
+
within[shape].to_mongo_query(input).should be_a_kind_of(Hash)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
|