Skip to content

Commit

Permalink
Removing squeel from GeographicItem.
Browse files Browse the repository at this point in the history
  • Loading branch information
TuckerJD committed Jun 19, 2014
1 parent 044c282 commit 6a4f5b4
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 18 deletions.
2 changes: 1 addition & 1 deletion Gemfile
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ gem 'pg', '~> 0.17.0'
# Postgis
gem 'activerecord-postgis-adapter', '~> 2.1.0'
# Has been removed for some time?
gem 'squeel', git: 'https://github.com/gtimti/squeel.git' # nybex and kiela forks were also used
# gem 'squeel', git: 'https://github.com/gtimti/squeel.git' # nybex and kiela forks were also used

# rgeo support
gem 'ffi-geos'
Expand Down
43 changes: 26 additions & 17 deletions app/models/geographic_item.rb
Original file line number Diff line number Diff line change
Expand Up @@ -133,7 +133,10 @@ def self.contains?(geo_object_a, geo_object_b)
end

def self.intersecting(column_name, *geographic_items)
where { geographic_items.flatten.collect { |geographic_item| "ST_Intersects(#{column_name}, 'srid=4326;#{geographic_item.geo_object}')" }.join(' and ') }
q = geographic_items.flatten.collect { |geographic_item|
"ST_Intersects(#{column_name}, 'srid=4326;#{geographic_item.geo_object}')"
}.join(' and ')
where (q)
=begin
geographic_items.each { |geographic_item|
# where("st_contains(geographic_items.#{column_name}, ST_GeomFromText('#{geographic_item.to_s}'))")
Expand All @@ -148,42 +151,45 @@ def self.intersecting(column_name, *geographic_items)
# TODO: Document, what units are distance in?
def self.within_radius_of(column_name, geographic_item, distance)
if check_geo_params(column_name, geographic_item)
where { "st_distance(#{column_name}, GeomFromEWKT('srid=4326;#{geographic_item.geo_object}')) < #{distance}" }
where ("st_distance(#{column_name}, GeomFromEWKT('srid=4326;#{geographic_item.geo_object}')) < #{distance}")
else
where { 'false' }
where ('false')
end
end

def self.disjoint_from(column_name, *geographic_items)
where { geographic_items.flatten.collect { |geographic_item| "st_disjoint(#{column_name}::geometry, GeomFromEWKT('srid=4326;#{geographic_item.geo_object}'))" }.join(' and ') }
q = geographic_items.flatten.collect { |geographic_item|
"st_disjoint(#{column_name}::geometry, GeomFromEWKT('srid=4326;#{geographic_item.geo_object}'))"
}.join(' and ')
where (q)
end

# If this scope is given an Array of GeographicItems as a second parameter,
# it will return the 'or' of each of the objects against the table.
# SELECT COUNT(*) FROM "geographic_items" WHERE (ST_Contains(polygon::geometry, GeomFromEWKT('srid=4326;POINT (0.0 0.0 0.0)')) or ST_Contains(polygon::geometry, GeomFromEWKT('srid=4326;POINT (-9.8 5.0 0.0)')))
def self.containing(column_name, *geographic_items)
where { geographic_items.flatten.collect { |geographic_item| GeographicItem.containing_sql(column_name, geographic_item) }.join(' or ') }
q = geographic_items.flatten.collect { |geographic_item| GeographicItem.containing_sql(column_name, geographic_item) }.join(' or ')
where(q)
end

def self.ordered_by_shortest_distance_from(column_name, geographic_item)
if check_geo_params(column_name, geographic_item)
f = select { '*' }.
select_distance(column_name, geographic_item).
where_distance_greater_than_zero(column_name, geographic_item).
order { 'distance' }
q = select_distance_with_geo_object(column_name, geographic_item).where_distance_greater_than_zero(column_name, geographic_item).order('distance')
q
else
where { 'false' }
where ('false')
end

end

def self.ordered_by_longest_distance_from(column_name, geographic_item)
if check_geo_params(column_name, geographic_item)
f = select { '*' }.
select_distance(column_name, geographic_item).
q = select_distance_with_geo_object(column_name, geographic_item).
where_distance_greater_than_zero(column_name, geographic_item).
order { 'distance desc' }
order('distance desc')
q
else
where { 'false' }
where ('false')
end
end

Expand All @@ -194,15 +200,18 @@ def self.containing_sql(column_name, geographic_item)
end

def self.select_distance(column_name, geographic_item)
select { "ST_Distance(#{column_name}, GeomFromEWKT('srid=4326;#{geographic_item.geo_object}')) as distance" }
# select { "ST_Distance(#{column_name}, GeomFromEWKT('srid=4326;#{geographic_item.geo_object}')) as distance" }
select(" ST_Distance(#{column_name}, GeomFromEWKT('srid=4326;#{geographic_item.geo_object}')) as distance")
end

def self.select_distance_with_geo_object(column_name, geographic_item)
select { '*' }.select_distance(column_name, geographic_item)
# q = select_distance(column_name, geographic_item)
# select { '*' }.select_distance(column_name, geographic_item)
select("*, ST_Distance(#{column_name}, GeomFromEWKT('srid=4326;#{geographic_item.geo_object}')) as distance")
end

def self.where_distance_greater_than_zero(column_name, geographic_item)
where { "#{column_name} is not null and ST_Distance(#{column_name}, GeomFromEWKT('srid=4326;#{geographic_item.geo_object}')) > 0" }
where ("#{column_name} is not null and ST_Distance(#{column_name}, GeomFromEWKT('srid=4326;#{geographic_item.geo_object}')) > 0")
end

def self.excluding(geographic_items)
Expand Down
1 change: 1 addition & 0 deletions spec/models/geographic_item_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -670,6 +670,7 @@

#TODOone: Is this test right? What about @k, @d?
# @k is too far away for a limit of 4, and #d in not a polygon, it is a line_string
# SELECT "geographic_items".* FROM "geographic_items" WHERE (st_disjoint(polygon::geometry, GeomFromEWKT('srid=4326;POLYGON ((-19.0 9.0 0.0, -9.0 9.0 0.0, -9.0 2.0 0.0, -19.0 2.0 0.0, -19.0 9.0 0.0))')) and st_disjoint(polygon::geometry, GeomFromEWKT('srid=4326;POLYGON ((5.0 -1.0 0.0, -14.0 -1.0 0.0, -14.0 6.0 0.0, 5.0 6.0 0.0, 5.0 -1.0 0.0))')) and st_disjoint(polygon::geometry, GeomFromEWKT('srid=4326;POLYGON ((-11.0 -1.0 0.0, -11.0 -5.0 0.0, -7.0 -5.0 0.0, -7.0 -1.0 0.0, -11.0 -1.0 0.0))')) and st_disjoint(polygon::geometry, GeomFromEWKT('srid=4326;POLYGON ((-3.0 -9.0 0.0, -3.0 -1.0 0.0, -7.0 -1.0 0.0, -7.0 -9.0 0.0, -3.0 -9.0 0.0))')) and st_disjoint(polygon::geometry, GeomFromEWKT('srid=4326;POLYGON ((-7.0 -9.0 0.0, -7.0 -5.0 0.0, -11.0 -5.0 0.0, -11.0 -9.0 0.0, -7.0 -9.0 0.0))'))) LIMIT 4
specify "#disjoint_from list of objects (uses 'and')." do
expect(GeographicItem.disjoint_from('polygon', [@e1, @e2, @e3, @e4, @e5]).limit(4).to_a).to eq([@b1, @b2, @b, @g1])
end
Expand Down

0 comments on commit 6a4f5b4

Please sign in to comment.