Class: Parse::Constraint::WithinPolygonQueryConstraint
- Inherits:
-
Parse::Constraint
- Object
- Parse::Constraint
- Parse::Constraint::WithinPolygonQueryConstraint
- Defined in:
- lib/parse/query/constraints.rb
Overview
Equivalent to the ‘$geoWithin` Parse query operation and `$polygon` geopoints constraint. The polygon area is defined by a list of GeoPoint objects that make up the enclosed area. A polygon query should have 3 or more geopoints. Please note that some Geo queries that cross the international date lines are not currently supported by Parse.
# As many points as you want, minimum 3
q.where :field.within_polygon => [geopoint1, geopoint2, geopoint3]
# Polygon for the Bermuda Triangle
bermuda = Parse::GeoPoint.new 32.3078000,-64.7504999 # Bermuda
miami = Parse::GeoPoint.new 25.7823198,-80.2660226 # Miami, FL
san_juan = Parse::GeoPoint.new 18.3848232,-66.0933608 # San Juan, PR
# get all sunken ships inside the Bermuda Triangle
SunkenShip.all :location.within_polygon => [bermuda, san_juan, miami]
Instance Attribute Summary
Attributes inherited from Parse::Constraint
#operand, #operation, #operator, #value
Instance Method Summary collapse
-
#build ⇒ Hash
The compiled constraint.
-
#within_polygon ⇒ WithinPolygonQueryConstraint
A registered method on a symbol to create the constraint.
Methods inherited from Parse::Constraint
#as_json, constraint_keyword, create, formatted_value, #formatted_value, #initialize, #key, #precedence, register, #to_s
Constructor Details
This class inherits a constructor from Parse::Constraint
Instance Method Details
#build ⇒ Hash
Returns the compiled constraint.
1886 1887 1888 1889 1890 1891 1892 1893 1894 1895 1896 1897 1898 1899 1900 1901 1902 1903 1904 1905 1906 1907 1908 1909 1910 1911 1912 1913 1914 |
# File 'lib/parse/query/constraints.rb', line 1886 def build value = formatted_value if value.is_a?(Parse::Polygon) # Parse Server's REST `$polygon` operator expects the legacy # array-of-GeoPoint wire shape (each element a # `{__type: "GeoPoint", latitude:, longitude:}` hash). The # `{__type: "Polygon", coordinates: ...}` wrapper that # `Parse::Polygon#as_json` produces is the storage / property # shape, NOT a valid `$polygon` operand. If it reaches Parse # Server it is rejected with a 500; if it ever reached raw # MongoDB, `$polygon` requires `[lng, lat]` order while # `Parse::Polygon.coordinates` stores `[lat, lng]` — silent # axis swap. Convert here. geopoints = value.coordinates.map do |(lat, lng)| { __type: "GeoPoint", latitude: lat, longitude: lng } end return { @operation.operand => { :$geoWithin => { :$polygon => geopoints } } } end unless value.is_a?(Array) && value.all? { |point| point.is_a?(Parse::GeoPoint) } && value.count > 2 raise ArgumentError, "[Parse::Query] Invalid query value parameter passed to" \ " `within_polygon` constraint: Value must be a Parse::Polygon, or an array" \ " with 3 or more `Parse::GeoPoint` objects." end { @operation.operand => { :$geoWithin => { :$polygon => value } } } end |
#within_polygon ⇒ WithinPolygonQueryConstraint
1882 |
# File 'lib/parse/query/constraints.rb', line 1882 constraint_keyword :$geoWithin |