Class: ActiveRecord::ConnectionAdapters::CockroachDB::OID::Spatial
- Inherits:
-
Type::Value
- Object
- Type::Value
- ActiveRecord::ConnectionAdapters::CockroachDB::OID::Spatial
- Defined in:
- lib/active_record/connection_adapters/cockroachdb/oid/spatial.rb
Class Method Summary collapse
-
.parse_sql_type(sql_type) ⇒ Object
sql_type: geometry, geometry(Point), geometry(Point,4326), …
Instance Method Summary collapse
- #geographic? ⇒ Boolean
-
#initialize(oid, sql_type) ⇒ Spatial
constructor
sql_type is a string that comes from the database definition examples: “geometry(Point,4326)” “geography(Point,4326)” “geometry(Polygon,4326) NOT NULL” “geometry(Geography,4326)”.
-
#serialize(value) ⇒ Object
support setting an RGeo object or a WKT string.
- #spatial? ⇒ Boolean
- #spatial_factory ⇒ Object
- #type ⇒ Object
Constructor Details
#initialize(oid, sql_type) ⇒ Spatial
sql_type is a string that comes from the database definition examples:
"geometry(Point,4326)"
"geography(Point,4326)"
"geometry(Polygon,4326) NOT NULL"
"geometry(Geography,4326)"
28 29 30 31 |
# File 'lib/active_record/connection_adapters/cockroachdb/oid/spatial.rb', line 28 def initialize(oid, sql_type) @sql_type = sql_type @geo_type, @srid, @has_z, @has_m = self.class.parse_sql_type(sql_type) end |
Class Method Details
.parse_sql_type(sql_type) ⇒ Object
sql_type: geometry, geometry(Point), geometry(Point,4326), …
returns [geo_type, srid, has_z, has_m]
geo_type: geography, geometry, point, line_string, polygon, ...
srid: 1234
has_z: false
has_m: false
40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
# File 'lib/active_record/connection_adapters/cockroachdb/oid/spatial.rb', line 40 def self.parse_sql_type(sql_type) geo_type = nil srid = 0 has_z = false has_m = false if sql_type =~ /(geography|geometry)\((.*)\)$/i # geometry(Point) # geometry(Point,4326) params = Regexp.last_match(2).split(',') if params.first =~ /([a-z]+[^zm])(z?)(m?)/i has_z = Regexp.last_match(2).length > 0 has_m = Regexp.last_match(3).length > 0 geo_type = Regexp.last_match(1) end srid = Regexp.last_match(1).to_i if params.last =~ /(\d+)/ else geo_type = sql_type end [geo_type, srid, has_z, has_m] end |
Instance Method Details
#geographic? ⇒ Boolean
69 70 71 |
# File 'lib/active_record/connection_adapters/cockroachdb/oid/spatial.rb', line 69 def geographic? @sql_type =~ /geography/ end |
#serialize(value) ⇒ Object
support setting an RGeo object or a WKT string
82 83 84 85 86 87 88 89 90 91 92 93 |
# File 'lib/active_record/connection_adapters/cockroachdb/oid/spatial.rb', line 82 def serialize(value) return if value.nil? geo_value = cast_value(value) # TODO: - only valid types should be allowed # e.g. linestring is not valid for point column # raise "maybe should raise" unless RGeo::Feature::Geometry.check_type(geo_value) RGeo::WKRep::WKBGenerator.new(hex_format: true, type_format: :ewkb, emit_ewkb_srid: true) .generate(geo_value) end |
#spatial? ⇒ Boolean
73 74 75 |
# File 'lib/active_record/connection_adapters/cockroachdb/oid/spatial.rb', line 73 def spatial? true end |
#spatial_factory ⇒ Object
62 63 64 65 66 67 |
# File 'lib/active_record/connection_adapters/cockroachdb/oid/spatial.rb', line 62 def spatial_factory @spatial_factory ||= RGeo::ActiveRecord::SpatialFactoryStore.instance.factory( factory_attrs ) end |
#type ⇒ Object
77 78 79 |
# File 'lib/active_record/connection_adapters/cockroachdb/oid/spatial.rb', line 77 def type geographic? ? :geography : :geometry end |