class ActiveRecord::ConnectionAdapters::CockroachDB::OID::Spatial

Public Class Methods

new(oid, sql_type) click to toggle source

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)"
# File lib/active_record/connection_adapters/cockroachdb/oid/spatial.rb, line 14
def initialize(oid, sql_type)
  @sql_type = sql_type
  @geo_type, @srid, @has_z, @has_m = self.class.parse_sql_type(sql_type)
end
parse_sql_type(sql_type) click to toggle source

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
# File lib/active_record/connection_adapters/cockroachdb/oid/spatial.rb, line 26
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

Public Instance Methods

geographic?() click to toggle source
# File lib/active_record/connection_adapters/cockroachdb/oid/spatial.rb, line 55
def geographic?
  @sql_type =~ /geography/
end
serialize(value) click to toggle source

support setting an RGeo object or a WKT string

# File lib/active_record/connection_adapters/cockroachdb/oid/spatial.rb, line 68
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?() click to toggle source
# File lib/active_record/connection_adapters/cockroachdb/oid/spatial.rb, line 59
def spatial?
  true
end
spatial_factory() click to toggle source
# File lib/active_record/connection_adapters/cockroachdb/oid/spatial.rb, line 48
def spatial_factory
  @spatial_factory ||=
    RGeo::ActiveRecord::SpatialFactoryStore.instance.factory(
      factory_attrs
    )
end
type() click to toggle source
# File lib/active_record/connection_adapters/cockroachdb/oid/spatial.rb, line 63
def type
  geographic? ? :geography : :geometry
end

Private Instance Methods

binary_string?(string) click to toggle source
# File lib/active_record/connection_adapters/cockroachdb/oid/spatial.rb, line 96
def binary_string?(string)
  string[0] == "\x00" || string[0] == "\x01" || string[0, 4] =~ /[0-9a-fA-F]{4}/
end
cast_value(value) click to toggle source
# File lib/active_record/connection_adapters/cockroachdb/oid/spatial.rb, line 83
def cast_value(value)
  return if value.nil?

  value.is_a?(String) ? parse_wkt(value) : value
end
factory_attrs() click to toggle source
# File lib/active_record/connection_adapters/cockroachdb/oid/spatial.rb, line 108
def factory_attrs
  {
    geo_type: @geo_type.underscore,
    has_m: @has_m,
    has_z: @has_z,
    srid: @srid,
    sql_type: type.to_s
  }
end
parse_wkt(string) click to toggle source

convert WKT string into RGeo object

# File lib/active_record/connection_adapters/cockroachdb/oid/spatial.rb, line 90
def parse_wkt(string)
  wkt_parser(string).parse(string)
rescue RGeo::Error::ParseError
  nil
end
wkt_parser(string) click to toggle source
# File lib/active_record/connection_adapters/cockroachdb/oid/spatial.rb, line 100
def wkt_parser(string)
  if binary_string?(string)
    RGeo::WKRep::WKBParser.new(spatial_factory, support_ewkb: true, default_srid: @srid)
  else
    RGeo::WKRep::WKTParser.new(spatial_factory, support_ewkt: true, default_srid: @srid)
  end
end