active_record_mysql_spatial 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
 - data/README.md +35 -0
 - data/Rakefile +8 -0
 - data/active_record_mysql_spatial.gemspec +47 -0
 - data/lib/active_record_mysql_spatial/active_record/column_methods.rb +17 -0
 - data/lib/active_record_mysql_spatial/active_record/mysql/base.rb +79 -0
 - data/lib/active_record_mysql_spatial/active_record/mysql/linestring.rb +55 -0
 - data/lib/active_record_mysql_spatial/active_record/mysql/multilinestring.rb +60 -0
 - data/lib/active_record_mysql_spatial/active_record/mysql/point.rb +69 -0
 - data/lib/active_record_mysql_spatial/active_record/native_types.rb +29 -0
 - data/lib/active_record_mysql_spatial/active_record/quoting.rb +30 -0
 - data/lib/active_record_mysql_spatial/active_record/register_types.rb +42 -0
 - data/lib/active_record_mysql_spatial/geometry.rb +69 -0
 - data/lib/active_record_mysql_spatial/version.rb +5 -0
 - data/lib/active_record_mysql_spatial.rb +32 -0
 - metadata +78 -0
 
    
        checksums.yaml
    ADDED
    
    | 
         @@ -0,0 +1,7 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            ---
         
     | 
| 
      
 2 
     | 
    
         
            +
            SHA256:
         
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: c1fb8466cfa0fa405fd35472dfa05122712db0dc27b7a3daad65d6c0329736ab
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: c58c26a2abff58ae9d9c32e710b7898db5648a5980db891deb71911b82336140
         
     | 
| 
      
 5 
     | 
    
         
            +
            SHA512:
         
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: ded6ba2548871b914758b5306c8b0b6b68f3922e059c3895e2e938e7a7fe6cb781f42e084d46b9871ba71e7a429097f2b9ed52d66b5e415f1bd2132b9d17b7c1
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 162ab35dd4901102eb470bf71c7086ea1febd6de8d24695415a4be983df2b51cf1bb0399b0dac7e9fa1b0aca32e7cbea945fd588ffbcfd14e2f1de27b14876e0
         
     | 
    
        data/README.md
    ADDED
    
    | 
         @@ -0,0 +1,35 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # ActiveRecordMysqlSpatial
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            TODO: Delete this and the text below, and describe your gem
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/active_record_mysql_spatial`. To experiment with that code, run `bin/console` for an interactive prompt.
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            ## Installation
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            TODO: Replace `UPDATE_WITH_YOUR_GEM_NAME_IMMEDIATELY_AFTER_RELEASE_TO_RUBYGEMS_ORG` with your gem name right after releasing it to RubyGems.org. Please do not do it earlier due to security reasons. Alternatively, replace this section with instructions to install your gem from git if you don't plan to release to RubyGems.org.
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            Install the gem and add to the application's Gemfile by executing:
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
                $ bundle add UPDATE_WITH_YOUR_GEM_NAME_IMMEDIATELY_AFTER_RELEASE_TO_RUBYGEMS_ORG
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
            If bundler is not being used to manage dependencies, install the gem by executing:
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
                $ gem install UPDATE_WITH_YOUR_GEM_NAME_IMMEDIATELY_AFTER_RELEASE_TO_RUBYGEMS_ORG
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
            ## Usage
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
            TODO: Write usage instructions here
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
            ## Development
         
     | 
| 
      
 24 
     | 
    
         
            +
             
     | 
| 
      
 25 
     | 
    
         
            +
            After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
            To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
            ## Contributing
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
            Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/active_record_mysql_spatial.
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
            ## License
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
            The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
         
     | 
    
        data/Rakefile
    ADDED
    
    
| 
         @@ -0,0 +1,47 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require_relative 'lib/active_record_mysql_spatial/version'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            Gem::Specification.new do |spec|
         
     | 
| 
      
 6 
     | 
    
         
            +
              spec.name = 'active_record_mysql_spatial'
         
     | 
| 
      
 7 
     | 
    
         
            +
              spec.version = ActiveRecordMysqlSpatial::VERSION
         
     | 
| 
      
 8 
     | 
    
         
            +
              spec.authors = ['Alpha']
         
     | 
| 
      
 9 
     | 
    
         
            +
              spec.email = ['alphanolucifer@gmail.com']
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
              spec.summary = 'MySQL Spatial Data Types for ActiveRecord'
         
     | 
| 
      
 12 
     | 
    
         
            +
              spec.description = 'MySQL Spatial Data Types for ActiveRecord'
         
     | 
| 
      
 13 
     | 
    
         
            +
              spec.homepage = 'https://github.com/zgid123/active_record_mysql_spatial'
         
     | 
| 
      
 14 
     | 
    
         
            +
              spec.license = 'MIT'
         
     | 
| 
      
 15 
     | 
    
         
            +
              spec.required_ruby_version = '>= 2.6.0'
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
              spec.metadata['homepage_uri'] = spec.homepage
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
              spec.files = Dir.chdir(__dir__) do
         
     | 
| 
      
 20 
     | 
    
         
            +
                `git ls-files -z`.split("\x0").reject do |f|
         
     | 
| 
      
 21 
     | 
    
         
            +
                  (File.expand_path(f) == __FILE__) ||
         
     | 
| 
      
 22 
     | 
    
         
            +
                    f.start_with?(
         
     | 
| 
      
 23 
     | 
    
         
            +
                      *%w[
         
     | 
| 
      
 24 
     | 
    
         
            +
                        bin/
         
     | 
| 
      
 25 
     | 
    
         
            +
                        test/
         
     | 
| 
      
 26 
     | 
    
         
            +
                        spec/
         
     | 
| 
      
 27 
     | 
    
         
            +
                        features/
         
     | 
| 
      
 28 
     | 
    
         
            +
                        .git
         
     | 
| 
      
 29 
     | 
    
         
            +
                        .circleci
         
     | 
| 
      
 30 
     | 
    
         
            +
                        appveyor
         
     | 
| 
      
 31 
     | 
    
         
            +
                        examples/
         
     | 
| 
      
 32 
     | 
    
         
            +
                        Gemfile
         
     | 
| 
      
 33 
     | 
    
         
            +
                        .rubocop.yml
         
     | 
| 
      
 34 
     | 
    
         
            +
                        .vscode/settings.json
         
     | 
| 
      
 35 
     | 
    
         
            +
                        LICENSE.txt
         
     | 
| 
      
 36 
     | 
    
         
            +
                        lefthook.yml
         
     | 
| 
      
 37 
     | 
    
         
            +
                      ]
         
     | 
| 
      
 38 
     | 
    
         
            +
                    )
         
     | 
| 
      
 39 
     | 
    
         
            +
                end
         
     | 
| 
      
 40 
     | 
    
         
            +
              end
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
              spec.require_paths = ['lib']
         
     | 
| 
      
 43 
     | 
    
         
            +
              spec.bindir = 'exe'
         
     | 
| 
      
 44 
     | 
    
         
            +
              spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
              spec.add_runtime_dependency 'rgeo', '~> 3.0', '>= 3.0.1'
         
     | 
| 
      
 47 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,17 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'active_support/concern'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            module ActiveRecordMysqlSpatial
         
     | 
| 
      
 6 
     | 
    
         
            +
              module ActiveRecord
         
     | 
| 
      
 7 
     | 
    
         
            +
                module ColumnMethods
         
     | 
| 
      
 8 
     | 
    
         
            +
                  extend ActiveSupport::Concern
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
                  included do
         
     | 
| 
      
 11 
     | 
    
         
            +
                    define_column_methods :point,
         
     | 
| 
      
 12 
     | 
    
         
            +
                                          :linestring,
         
     | 
| 
      
 13 
     | 
    
         
            +
                                          :multilinestring
         
     | 
| 
      
 14 
     | 
    
         
            +
                  end
         
     | 
| 
      
 15 
     | 
    
         
            +
                end
         
     | 
| 
      
 16 
     | 
    
         
            +
              end
         
     | 
| 
      
 17 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,79 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module ActiveRecordMysqlSpatial
         
     | 
| 
      
 4 
     | 
    
         
            +
              module ActiveRecord
         
     | 
| 
      
 5 
     | 
    
         
            +
                module MySQL
         
     | 
| 
      
 6 
     | 
    
         
            +
                  class Base < ::ActiveRecord::Type::Json
         
     | 
| 
      
 7 
     | 
    
         
            +
                    attr_reader :raw,
         
     | 
| 
      
 8 
     | 
    
         
            +
                                :error
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
                    def type
         
     | 
| 
      
 11 
     | 
    
         
            +
                      raise NotImplementedError
         
     | 
| 
      
 12 
     | 
    
         
            +
                    end
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
                    def deserialize(value)
         
     | 
| 
      
 15 
     | 
    
         
            +
                      return value if value.is_a?(self.class)
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
                      cast_value(value)
         
     | 
| 
      
 18 
     | 
    
         
            +
                    end
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
                    def serialize(value)
         
     | 
| 
      
 21 
     | 
    
         
            +
                      if value.is_a?(self.class)
         
     | 
| 
      
 22 
     | 
    
         
            +
                        value
         
     | 
| 
      
 23 
     | 
    
         
            +
                      else
         
     | 
| 
      
 24 
     | 
    
         
            +
                        return unless valid_hash?(value)
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                        cast_value(value)
         
     | 
| 
      
 27 
     | 
    
         
            +
                      end
         
     | 
| 
      
 28 
     | 
    
         
            +
                    end
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
                    def to_sql
         
     | 
| 
      
 31 
     | 
    
         
            +
                      raise NotImplementedError
         
     | 
| 
      
 32 
     | 
    
         
            +
                    end
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
                    def to_coordinates_sql
         
     | 
| 
      
 35 
     | 
    
         
            +
                      raise NotImplementedError
         
     | 
| 
      
 36 
     | 
    
         
            +
                    end
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
                    private
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
                    def cast_value(value)
         
     | 
| 
      
 41 
     | 
    
         
            +
                      raise NotImplementedError
         
     | 
| 
      
 42 
     | 
    
         
            +
                    end
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
                    def extract_coordinates(attributes, type: :linestring)
         
     | 
| 
      
 45 
     | 
    
         
            +
                      return [drill_coordinates(attributes) || [], true] if valid_hash?(attributes, type: type)
         
     | 
| 
      
 46 
     | 
    
         
            +
                      return [[], false] unless attributes.is_a?(String)
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
                      if attributes.encoding.to_s == 'ASCII-8BIT'
         
     | 
| 
      
 49 
     | 
    
         
            +
                        linestring = Geometry.parse_bin(attributes)
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
                        [linestring.coordinates, false]
         
     | 
| 
      
 52 
     | 
    
         
            +
                      elsif Geometry.valid_spatial?(attributes)
         
     | 
| 
      
 53 
     | 
    
         
            +
                        spatial_data = Geometry.from_text(attributes)
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
                        [spatial_data.coordinates, true]
         
     | 
| 
      
 56 
     | 
    
         
            +
                      else
         
     | 
| 
      
 57 
     | 
    
         
            +
                        parsed_json = ::ActiveSupport::JSON.decode(attributes)
         
     | 
| 
      
 58 
     | 
    
         
            +
             
     | 
| 
      
 59 
     | 
    
         
            +
                        [parsed_json['coordinates'] || [], true]
         
     | 
| 
      
 60 
     | 
    
         
            +
                      end
         
     | 
| 
      
 61 
     | 
    
         
            +
                    end
         
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
      
 63 
     | 
    
         
            +
                    def valid_hash?(attributes, type: :linestring)
         
     | 
| 
      
 64 
     | 
    
         
            +
                      return false unless attributes.is_a?(Hash)
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
                      valid_coord_hash = attributes.key?(:coordinates) || attributes.key?('coordinates') || attributes.key?(:coordinate) || attributes.key?('coordinate')
         
     | 
| 
      
 67 
     | 
    
         
            +
             
     | 
| 
      
 68 
     | 
    
         
            +
                      return valid_coord_hash unless type == :point
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
      
 70 
     | 
    
         
            +
                      valid_coord_hash || attributes.key?(:x) || attributes.key?('x') || attributes.key?(:y) || attributes.key?('y')
         
     | 
| 
      
 71 
     | 
    
         
            +
                    end
         
     | 
| 
      
 72 
     | 
    
         
            +
             
     | 
| 
      
 73 
     | 
    
         
            +
                    def drill_coordinates(attributes)
         
     | 
| 
      
 74 
     | 
    
         
            +
                      attributes[:coordinates].presence || attributes['coordinates'].presence || attributes[:coordinate].presence || attributes['coordinate']
         
     | 
| 
      
 75 
     | 
    
         
            +
                    end
         
     | 
| 
      
 76 
     | 
    
         
            +
                  end
         
     | 
| 
      
 77 
     | 
    
         
            +
                end
         
     | 
| 
      
 78 
     | 
    
         
            +
              end
         
     | 
| 
      
 79 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,55 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require_relative 'base'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require_relative 'point'
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            module ActiveRecordMysqlSpatial
         
     | 
| 
      
 7 
     | 
    
         
            +
              module ActiveRecord
         
     | 
| 
      
 8 
     | 
    
         
            +
                module MySQL
         
     | 
| 
      
 9 
     | 
    
         
            +
                  class Linestring < Base
         
     | 
| 
      
 10 
     | 
    
         
            +
                    attr_reader :coordinates
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                    def type
         
     | 
| 
      
 13 
     | 
    
         
            +
                      :linestring
         
     | 
| 
      
 14 
     | 
    
         
            +
                    end
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                    def to_sql
         
     | 
| 
      
 17 
     | 
    
         
            +
                      return nil if @coordinates.blank?
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                      "LineString(#{to_coordinates_sql})"
         
     | 
| 
      
 20 
     | 
    
         
            +
                    end
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
                    def to_coordinates_sql
         
     | 
| 
      
 23 
     | 
    
         
            +
                      @coordinates.map(&:to_coordinate_sql).compact.join(', ')
         
     | 
| 
      
 24 
     | 
    
         
            +
                    end
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                    def ==(other)
         
     | 
| 
      
 27 
     | 
    
         
            +
                      coordinates.each_with_index do |coord, index|
         
     | 
| 
      
 28 
     | 
    
         
            +
                        return false if coord != other.coordinates[index]
         
     | 
| 
      
 29 
     | 
    
         
            +
                      end
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
                      true
         
     | 
| 
      
 32 
     | 
    
         
            +
                    end
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
                    private
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
                    def cast_value(value)
         
     | 
| 
      
 37 
     | 
    
         
            +
                      @raw = value
         
     | 
| 
      
 38 
     | 
    
         
            +
                      coordinates, create_raw = extract_coordinates(value)
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
                      @raw = Geometry.from_coordinates(coordinates).as_binary if create_raw
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
                      @coordinates = coordinates.map do |coord|
         
     | 
| 
      
 43 
     | 
    
         
            +
                        Point.new.send(:cast_value, coord)
         
     | 
| 
      
 44 
     | 
    
         
            +
                      end
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
                      self
         
     | 
| 
      
 47 
     | 
    
         
            +
                    rescue StandardError => e
         
     | 
| 
      
 48 
     | 
    
         
            +
                      @error = e.message
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
                      self
         
     | 
| 
      
 51 
     | 
    
         
            +
                    end
         
     | 
| 
      
 52 
     | 
    
         
            +
                  end
         
     | 
| 
      
 53 
     | 
    
         
            +
                end
         
     | 
| 
      
 54 
     | 
    
         
            +
              end
         
     | 
| 
      
 55 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,60 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require_relative 'base'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require_relative 'linestring'
         
     | 
| 
      
 5 
     | 
    
         
            +
             
     | 
| 
      
 6 
     | 
    
         
            +
            module ActiveRecordMysqlSpatial
         
     | 
| 
      
 7 
     | 
    
         
            +
              module ActiveRecord
         
     | 
| 
      
 8 
     | 
    
         
            +
                module MySQL
         
     | 
| 
      
 9 
     | 
    
         
            +
                  class Multilinestring < Base
         
     | 
| 
      
 10 
     | 
    
         
            +
                    attr_accessor :items
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
                    def type
         
     | 
| 
      
 13 
     | 
    
         
            +
                      :multilinestring
         
     | 
| 
      
 14 
     | 
    
         
            +
                    end
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                    def to_sql
         
     | 
| 
      
 17 
     | 
    
         
            +
                      return nil if @items.blank?
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                      "MultiLineString(#{to_coordinates_sql})"
         
     | 
| 
      
 20 
     | 
    
         
            +
                    end
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
                    def to_coordinates_sql
         
     | 
| 
      
 23 
     | 
    
         
            +
                      items.map { |linestring| "(#{linestring.to_coordinates_sql})" }.join(',')
         
     | 
| 
      
 24 
     | 
    
         
            +
                    end
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                    def ==(other)
         
     | 
| 
      
 27 
     | 
    
         
            +
                      items.each_with_index do |item, index|
         
     | 
| 
      
 28 
     | 
    
         
            +
                        return false if item != other.items[index]
         
     | 
| 
      
 29 
     | 
    
         
            +
                      end
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
                      true
         
     | 
| 
      
 32 
     | 
    
         
            +
                    end
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
                    private
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
                    def cast_value(value)
         
     | 
| 
      
 37 
     | 
    
         
            +
                      @raw = value
         
     | 
| 
      
 38 
     | 
    
         
            +
                      coordinates, create_raw = extract_coordinates(value)
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
                      @raw = Geometry.from_coordinates(coordinates, type: :multilinestring).as_binary if create_raw
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
                      @items = coordinates.map do |linestring|
         
     | 
| 
      
 43 
     | 
    
         
            +
                        Linestring.new.send(
         
     | 
| 
      
 44 
     | 
    
         
            +
                          :cast_value,
         
     | 
| 
      
 45 
     | 
    
         
            +
                          {
         
     | 
| 
      
 46 
     | 
    
         
            +
                            coordinates: linestring
         
     | 
| 
      
 47 
     | 
    
         
            +
                          }
         
     | 
| 
      
 48 
     | 
    
         
            +
                        )
         
     | 
| 
      
 49 
     | 
    
         
            +
                      end
         
     | 
| 
      
 50 
     | 
    
         
            +
             
     | 
| 
      
 51 
     | 
    
         
            +
                      self
         
     | 
| 
      
 52 
     | 
    
         
            +
                    rescue StandardError => e
         
     | 
| 
      
 53 
     | 
    
         
            +
                      @error = e.message
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
                      self
         
     | 
| 
      
 56 
     | 
    
         
            +
                    end
         
     | 
| 
      
 57 
     | 
    
         
            +
                  end
         
     | 
| 
      
 58 
     | 
    
         
            +
                end
         
     | 
| 
      
 59 
     | 
    
         
            +
              end
         
     | 
| 
      
 60 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,69 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module ActiveRecordMysqlSpatial
         
     | 
| 
      
 4 
     | 
    
         
            +
              module ActiveRecord
         
     | 
| 
      
 5 
     | 
    
         
            +
                module MySQL
         
     | 
| 
      
 6 
     | 
    
         
            +
                  class Point < Base
         
     | 
| 
      
 7 
     | 
    
         
            +
                    attr_reader :x,
         
     | 
| 
      
 8 
     | 
    
         
            +
                                :y
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
                    def type
         
     | 
| 
      
 11 
     | 
    
         
            +
                      :point
         
     | 
| 
      
 12 
     | 
    
         
            +
                    end
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
                    def serialize(value)
         
     | 
| 
      
 15 
     | 
    
         
            +
                      if value.is_a?(Point)
         
     | 
| 
      
 16 
     | 
    
         
            +
                        value
         
     | 
| 
      
 17 
     | 
    
         
            +
                      else
         
     | 
| 
      
 18 
     | 
    
         
            +
                        return unless valid_hash?(value, type: :point)
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
                        cast_value(value)
         
     | 
| 
      
 21 
     | 
    
         
            +
                      end
         
     | 
| 
      
 22 
     | 
    
         
            +
                    end
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                    def to_sql
         
     | 
| 
      
 25 
     | 
    
         
            +
                      return nil if @x.nil? || @y.nil?
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                      "Point(#{to_coordinate_sql})"
         
     | 
| 
      
 28 
     | 
    
         
            +
                    end
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
                    def to_coordinate_sql
         
     | 
| 
      
 31 
     | 
    
         
            +
                      return nil if @x.nil? || @y.nil?
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                      "#{@x} #{@y}"
         
     | 
| 
      
 34 
     | 
    
         
            +
                    end
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
                    alias to_coordinates_sql to_coordinate_sql
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
                    def ==(other)
         
     | 
| 
      
 39 
     | 
    
         
            +
                      x == other.x && y == other.y
         
     | 
| 
      
 40 
     | 
    
         
            +
                    end
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
                    private
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
                    def cast_value(value)
         
     | 
| 
      
 45 
     | 
    
         
            +
                      @raw = value
         
     | 
| 
      
 46 
     | 
    
         
            +
                      coordinate, create_raw = extract_coordinates(value, type: :point)
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
                      @raw = Geometry.from_coordinates(coordinate, type: :point).as_binary if create_raw
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
                      @x, @y = if coordinate.is_a?(Array) && coordinate.present?
         
     | 
| 
      
 51 
     | 
    
         
            +
                                 [coordinate[0], coordinate[1]]
         
     | 
| 
      
 52 
     | 
    
         
            +
                               elsif value.is_a?(Array)
         
     | 
| 
      
 53 
     | 
    
         
            +
                                 [value[0], value[1]]
         
     | 
| 
      
 54 
     | 
    
         
            +
                               elsif value.is_a?(Hash)
         
     | 
| 
      
 55 
     | 
    
         
            +
                                 [value[:x] || value['x'], value[:y] || value['y']]
         
     | 
| 
      
 56 
     | 
    
         
            +
                               else
         
     | 
| 
      
 57 
     | 
    
         
            +
                                 [nil, nil]
         
     | 
| 
      
 58 
     | 
    
         
            +
                               end
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
                      self
         
     | 
| 
      
 61 
     | 
    
         
            +
                    rescue StandardError => e
         
     | 
| 
      
 62 
     | 
    
         
            +
                      @error = e.message
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
                      self
         
     | 
| 
      
 65 
     | 
    
         
            +
                    end
         
     | 
| 
      
 66 
     | 
    
         
            +
                  end
         
     | 
| 
      
 67 
     | 
    
         
            +
                end
         
     | 
| 
      
 68 
     | 
    
         
            +
              end
         
     | 
| 
      
 69 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,29 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'active_support/concern'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            module ActiveRecordMysqlSpatial
         
     | 
| 
      
 6 
     | 
    
         
            +
              module ActiveRecord
         
     | 
| 
      
 7 
     | 
    
         
            +
                module NativeTypes
         
     | 
| 
      
 8 
     | 
    
         
            +
                  extend ActiveSupport::Concern
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
                  included do
         
     | 
| 
      
 11 
     | 
    
         
            +
                    class_eval do
         
     | 
| 
      
 12 
     | 
    
         
            +
                      def native_database_types
         
     | 
| 
      
 13 
     | 
    
         
            +
                        self.class.const_get('NATIVE_DATABASE_TYPES').merge(
         
     | 
| 
      
 14 
     | 
    
         
            +
                          point: {
         
     | 
| 
      
 15 
     | 
    
         
            +
                            name: 'point'
         
     | 
| 
      
 16 
     | 
    
         
            +
                          },
         
     | 
| 
      
 17 
     | 
    
         
            +
                          linestring: {
         
     | 
| 
      
 18 
     | 
    
         
            +
                            name: 'linestring'
         
     | 
| 
      
 19 
     | 
    
         
            +
                          },
         
     | 
| 
      
 20 
     | 
    
         
            +
                          multilinestring: {
         
     | 
| 
      
 21 
     | 
    
         
            +
                            name: 'multilinestring'
         
     | 
| 
      
 22 
     | 
    
         
            +
                          }
         
     | 
| 
      
 23 
     | 
    
         
            +
                        )
         
     | 
| 
      
 24 
     | 
    
         
            +
                      end
         
     | 
| 
      
 25 
     | 
    
         
            +
                    end
         
     | 
| 
      
 26 
     | 
    
         
            +
                  end
         
     | 
| 
      
 27 
     | 
    
         
            +
                end
         
     | 
| 
      
 28 
     | 
    
         
            +
              end
         
     | 
| 
      
 29 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,30 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require_relative 'mysql/linestring'
         
     | 
| 
      
 4 
     | 
    
         
            +
            require_relative 'mysql/multilinestring'
         
     | 
| 
      
 5 
     | 
    
         
            +
            require_relative 'mysql/point'
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            module ActiveRecordMysqlSpatial
         
     | 
| 
      
 8 
     | 
    
         
            +
              module ActiveRecord
         
     | 
| 
      
 9 
     | 
    
         
            +
                module Quoting
         
     | 
| 
      
 10 
     | 
    
         
            +
                  def quote(value)
         
     | 
| 
      
 11 
     | 
    
         
            +
                    case value
         
     | 
| 
      
 12 
     | 
    
         
            +
                    when MySQL::Linestring, MySQL::Multilinestring, MySQL::Point
         
     | 
| 
      
 13 
     | 
    
         
            +
                      quote_geom(value)
         
     | 
| 
      
 14 
     | 
    
         
            +
                    else
         
     | 
| 
      
 15 
     | 
    
         
            +
                      super
         
     | 
| 
      
 16 
     | 
    
         
            +
                    end
         
     | 
| 
      
 17 
     | 
    
         
            +
                  end
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                  private
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                  def quote_geom(value)
         
     | 
| 
      
 22 
     | 
    
         
            +
                    spatial_raw = value.to_sql
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                    return 'NULL' if spatial_raw.blank?
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                    "ST_GeomFromText('#{spatial_raw}')"
         
     | 
| 
      
 27 
     | 
    
         
            +
                  end
         
     | 
| 
      
 28 
     | 
    
         
            +
                end
         
     | 
| 
      
 29 
     | 
    
         
            +
              end
         
     | 
| 
      
 30 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,42 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'active_support/concern'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            require_relative 'mysql/linestring'
         
     | 
| 
      
 6 
     | 
    
         
            +
            require_relative 'mysql/multilinestring'
         
     | 
| 
      
 7 
     | 
    
         
            +
            require_relative 'mysql/point'
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            module ActiveRecordMysqlSpatial
         
     | 
| 
      
 10 
     | 
    
         
            +
              module ActiveRecord
         
     | 
| 
      
 11 
     | 
    
         
            +
                module RegisterTypes
         
     | 
| 
      
 12 
     | 
    
         
            +
                  extend ActiveSupport::Concern
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
                  included do
         
     | 
| 
      
 15 
     | 
    
         
            +
                    class_eval do
         
     | 
| 
      
 16 
     | 
    
         
            +
                      class << self
         
     | 
| 
      
 17 
     | 
    
         
            +
                        private
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                        def custom_initialize_type_map(type_map)
         
     | 
| 
      
 20 
     | 
    
         
            +
                          type_map.register_type('point', MySQL::Point.new)
         
     | 
| 
      
 21 
     | 
    
         
            +
                          type_map.register_type('linestring', MySQL::Linestring.new)
         
     | 
| 
      
 22 
     | 
    
         
            +
                          type_map.register_type('multilinestring', MySQL::Multilinestring.new)
         
     | 
| 
      
 23 
     | 
    
         
            +
                        end
         
     | 
| 
      
 24 
     | 
    
         
            +
                      end
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                      remove_const('TYPE_MAP')
         
     | 
| 
      
 27 
     | 
    
         
            +
                      const_set(
         
     | 
| 
      
 28 
     | 
    
         
            +
                        'TYPE_MAP',
         
     | 
| 
      
 29 
     | 
    
         
            +
                        ::ActiveRecord::Type::TypeMap.new.tap do |m|
         
     | 
| 
      
 30 
     | 
    
         
            +
                          initialize_type_map(m)
         
     | 
| 
      
 31 
     | 
    
         
            +
                          custom_initialize_type_map(m)
         
     | 
| 
      
 32 
     | 
    
         
            +
                        end
         
     | 
| 
      
 33 
     | 
    
         
            +
                      )
         
     | 
| 
      
 34 
     | 
    
         
            +
                    end
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
                    ::ActiveRecord::Type.register(:point, MySQL::Point, adapter: :mysql2)
         
     | 
| 
      
 37 
     | 
    
         
            +
                    ::ActiveRecord::Type.register(:linestring, MySQL::Linestring, adapter: :mysql2)
         
     | 
| 
      
 38 
     | 
    
         
            +
                    ::ActiveRecord::Type.register(:multilinestring, MySQL::Multilinestring, adapter: :mysql2)
         
     | 
| 
      
 39 
     | 
    
         
            +
                  end
         
     | 
| 
      
 40 
     | 
    
         
            +
                end
         
     | 
| 
      
 41 
     | 
    
         
            +
              end
         
     | 
| 
      
 42 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,69 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            module ActiveRecordMysqlSpatial
         
     | 
| 
      
 4 
     | 
    
         
            +
              class Geometry
         
     | 
| 
      
 5 
     | 
    
         
            +
                class << self
         
     | 
| 
      
 6 
     | 
    
         
            +
                  def parse_bin(bin)
         
     | 
| 
      
 7 
     | 
    
         
            +
                    parser.parse(bin[4..])
         
     | 
| 
      
 8 
     | 
    
         
            +
                  end
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
                  def from_coordinates(coordinates, type: :linestring)
         
     | 
| 
      
 11 
     | 
    
         
            +
                    send("#{type}_from_coords", coordinates)
         
     | 
| 
      
 12 
     | 
    
         
            +
                  end
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
                  def from_text(value)
         
     | 
| 
      
 15 
     | 
    
         
            +
                    cartesian_factory.parse_wkt(value)
         
     | 
| 
      
 16 
     | 
    
         
            +
                  rescue StandardError
         
     | 
| 
      
 17 
     | 
    
         
            +
                    nil
         
     | 
| 
      
 18 
     | 
    
         
            +
                  end
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
                  def valid_spatial?(value)
         
     | 
| 
      
 21 
     | 
    
         
            +
                    point?(value) || linestring?(value) || multilinestring?(value)
         
     | 
| 
      
 22 
     | 
    
         
            +
                  end
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                  def point?(value)
         
     | 
| 
      
 25 
     | 
    
         
            +
                    /^point\(/i.match?(value)
         
     | 
| 
      
 26 
     | 
    
         
            +
                  end
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                  def linestring?(value)
         
     | 
| 
      
 29 
     | 
    
         
            +
                    /^linestring\(/i.match?(value)
         
     | 
| 
      
 30 
     | 
    
         
            +
                  end
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
                  def multilinestring?(value)
         
     | 
| 
      
 33 
     | 
    
         
            +
                    /^multilinestring\(/i.match?(value)
         
     | 
| 
      
 34 
     | 
    
         
            +
                  end
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
                  private
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
                  def point_from_coords(coordinate)
         
     | 
| 
      
 39 
     | 
    
         
            +
                    x, y = coordinate
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
                    cartesian_factory.point(x, y)
         
     | 
| 
      
 42 
     | 
    
         
            +
                  end
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
                  def linestring_from_coords(coordinates)
         
     | 
| 
      
 45 
     | 
    
         
            +
                    points = coordinates.map do |x, y|
         
     | 
| 
      
 46 
     | 
    
         
            +
                      cartesian_factory.point(x, y)
         
     | 
| 
      
 47 
     | 
    
         
            +
                    end
         
     | 
| 
      
 48 
     | 
    
         
            +
             
     | 
| 
      
 49 
     | 
    
         
            +
                    cartesian_factory.line_string(points)
         
     | 
| 
      
 50 
     | 
    
         
            +
                  end
         
     | 
| 
      
 51 
     | 
    
         
            +
             
     | 
| 
      
 52 
     | 
    
         
            +
                  def multilinestring_from_coords(coordinates)
         
     | 
| 
      
 53 
     | 
    
         
            +
                    line_strings = coordinates.map do |coordinate|
         
     | 
| 
      
 54 
     | 
    
         
            +
                      linestring_from_coords(coordinate)
         
     | 
| 
      
 55 
     | 
    
         
            +
                    end
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
                    cartesian_factory.multi_line_string(line_strings)
         
     | 
| 
      
 58 
     | 
    
         
            +
                  end
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
                  def parser
         
     | 
| 
      
 61 
     | 
    
         
            +
                    @parser ||= RGeo::WKRep::WKBParser.new
         
     | 
| 
      
 62 
     | 
    
         
            +
                  end
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
                  def cartesian_factory
         
     | 
| 
      
 65 
     | 
    
         
            +
                    @cartesian_factory ||= RGeo::Cartesian::Factory.new
         
     | 
| 
      
 66 
     | 
    
         
            +
                  end
         
     | 
| 
      
 67 
     | 
    
         
            +
                end
         
     | 
| 
      
 68 
     | 
    
         
            +
              end
         
     | 
| 
      
 69 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,32 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # frozen_string_literal: true
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            require 'rgeo'
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            require_relative 'active_record_mysql_spatial/active_record/column_methods'
         
     | 
| 
      
 6 
     | 
    
         
            +
            require_relative 'active_record_mysql_spatial/active_record/mysql/linestring'
         
     | 
| 
      
 7 
     | 
    
         
            +
            require_relative 'active_record_mysql_spatial/active_record/mysql/multilinestring'
         
     | 
| 
      
 8 
     | 
    
         
            +
            require_relative 'active_record_mysql_spatial/active_record/mysql/point'
         
     | 
| 
      
 9 
     | 
    
         
            +
            require_relative 'active_record_mysql_spatial/active_record/native_types'
         
     | 
| 
      
 10 
     | 
    
         
            +
            require_relative 'active_record_mysql_spatial/active_record/quoting'
         
     | 
| 
      
 11 
     | 
    
         
            +
            require_relative 'active_record_mysql_spatial/active_record/register_types'
         
     | 
| 
      
 12 
     | 
    
         
            +
            require_relative 'active_record_mysql_spatial/geometry'
         
     | 
| 
      
 13 
     | 
    
         
            +
            require_relative 'active_record_mysql_spatial/version'
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
            module ActiveRecordMysqlSpatial
         
     | 
| 
      
 16 
     | 
    
         
            +
              class Error < StandardError; end
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
              class Railtie < Rails::Railtie
         
     | 
| 
      
 19 
     | 
    
         
            +
                initializer 'active_record.override_mysql_spatial' do
         
     | 
| 
      
 20 
     | 
    
         
            +
                  ::ActiveSupport.on_load(:active_record) do
         
     | 
| 
      
 21 
     | 
    
         
            +
                    ::ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter.include ActiveRecordMysqlSpatial::ActiveRecord::Quoting
         
     | 
| 
      
 22 
     | 
    
         
            +
                    ::ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter.include ActiveRecordMysqlSpatial::ActiveRecord::NativeTypes
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
                    ::ActiveRecord::ConnectionAdapters::Mysql2Adapter.include ActiveRecordMysqlSpatial::ActiveRecord::RegisterTypes
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                    ::ActiveRecord::ConnectionAdapters::MySQL::Table.include ActiveRecordMysqlSpatial::ActiveRecord::ColumnMethods
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
                    ::ActiveRecord::ConnectionAdapters::MySQL::TableDefinition.include ActiveRecordMysqlSpatial::ActiveRecord::ColumnMethods
         
     | 
| 
      
 29 
     | 
    
         
            +
                  end
         
     | 
| 
      
 30 
     | 
    
         
            +
                end
         
     | 
| 
      
 31 
     | 
    
         
            +
              end
         
     | 
| 
      
 32 
     | 
    
         
            +
            end
         
     | 
    
        metadata
    ADDED
    
    | 
         @@ -0,0 +1,78 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            --- !ruby/object:Gem::Specification
         
     | 
| 
      
 2 
     | 
    
         
            +
            name: active_record_mysql_spatial
         
     | 
| 
      
 3 
     | 
    
         
            +
            version: !ruby/object:Gem::Version
         
     | 
| 
      
 4 
     | 
    
         
            +
              version: 0.1.0
         
     | 
| 
      
 5 
     | 
    
         
            +
            platform: ruby
         
     | 
| 
      
 6 
     | 
    
         
            +
            authors:
         
     | 
| 
      
 7 
     | 
    
         
            +
            - Alpha
         
     | 
| 
      
 8 
     | 
    
         
            +
            autorequire:
         
     | 
| 
      
 9 
     | 
    
         
            +
            bindir: exe
         
     | 
| 
      
 10 
     | 
    
         
            +
            cert_chain: []
         
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2024-09-09 00:00:00.000000000 Z
         
     | 
| 
      
 12 
     | 
    
         
            +
            dependencies:
         
     | 
| 
      
 13 
     | 
    
         
            +
            - !ruby/object:Gem::Dependency
         
     | 
| 
      
 14 
     | 
    
         
            +
              name: rgeo
         
     | 
| 
      
 15 
     | 
    
         
            +
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
      
 16 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 17 
     | 
    
         
            +
                - - "~>"
         
     | 
| 
      
 18 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 19 
     | 
    
         
            +
                    version: '3.0'
         
     | 
| 
      
 20 
     | 
    
         
            +
                - - ">="
         
     | 
| 
      
 21 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 22 
     | 
    
         
            +
                    version: 3.0.1
         
     | 
| 
      
 23 
     | 
    
         
            +
              type: :runtime
         
     | 
| 
      
 24 
     | 
    
         
            +
              prerelease: false
         
     | 
| 
      
 25 
     | 
    
         
            +
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
      
 26 
     | 
    
         
            +
                requirements:
         
     | 
| 
      
 27 
     | 
    
         
            +
                - - "~>"
         
     | 
| 
      
 28 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 29 
     | 
    
         
            +
                    version: '3.0'
         
     | 
| 
      
 30 
     | 
    
         
            +
                - - ">="
         
     | 
| 
      
 31 
     | 
    
         
            +
                  - !ruby/object:Gem::Version
         
     | 
| 
      
 32 
     | 
    
         
            +
                    version: 3.0.1
         
     | 
| 
      
 33 
     | 
    
         
            +
            description: MySQL Spatial Data Types for ActiveRecord
         
     | 
| 
      
 34 
     | 
    
         
            +
            email:
         
     | 
| 
      
 35 
     | 
    
         
            +
            - alphanolucifer@gmail.com
         
     | 
| 
      
 36 
     | 
    
         
            +
            executables: []
         
     | 
| 
      
 37 
     | 
    
         
            +
            extensions: []
         
     | 
| 
      
 38 
     | 
    
         
            +
            extra_rdoc_files: []
         
     | 
| 
      
 39 
     | 
    
         
            +
            files:
         
     | 
| 
      
 40 
     | 
    
         
            +
            - README.md
         
     | 
| 
      
 41 
     | 
    
         
            +
            - Rakefile
         
     | 
| 
      
 42 
     | 
    
         
            +
            - active_record_mysql_spatial.gemspec
         
     | 
| 
      
 43 
     | 
    
         
            +
            - lib/active_record_mysql_spatial.rb
         
     | 
| 
      
 44 
     | 
    
         
            +
            - lib/active_record_mysql_spatial/active_record/column_methods.rb
         
     | 
| 
      
 45 
     | 
    
         
            +
            - lib/active_record_mysql_spatial/active_record/mysql/base.rb
         
     | 
| 
      
 46 
     | 
    
         
            +
            - lib/active_record_mysql_spatial/active_record/mysql/linestring.rb
         
     | 
| 
      
 47 
     | 
    
         
            +
            - lib/active_record_mysql_spatial/active_record/mysql/multilinestring.rb
         
     | 
| 
      
 48 
     | 
    
         
            +
            - lib/active_record_mysql_spatial/active_record/mysql/point.rb
         
     | 
| 
      
 49 
     | 
    
         
            +
            - lib/active_record_mysql_spatial/active_record/native_types.rb
         
     | 
| 
      
 50 
     | 
    
         
            +
            - lib/active_record_mysql_spatial/active_record/quoting.rb
         
     | 
| 
      
 51 
     | 
    
         
            +
            - lib/active_record_mysql_spatial/active_record/register_types.rb
         
     | 
| 
      
 52 
     | 
    
         
            +
            - lib/active_record_mysql_spatial/geometry.rb
         
     | 
| 
      
 53 
     | 
    
         
            +
            - lib/active_record_mysql_spatial/version.rb
         
     | 
| 
      
 54 
     | 
    
         
            +
            homepage: https://github.com/zgid123/active_record_mysql_spatial
         
     | 
| 
      
 55 
     | 
    
         
            +
            licenses:
         
     | 
| 
      
 56 
     | 
    
         
            +
            - MIT
         
     | 
| 
      
 57 
     | 
    
         
            +
            metadata:
         
     | 
| 
      
 58 
     | 
    
         
            +
              homepage_uri: https://github.com/zgid123/active_record_mysql_spatial
         
     | 
| 
      
 59 
     | 
    
         
            +
            post_install_message:
         
     | 
| 
      
 60 
     | 
    
         
            +
            rdoc_options: []
         
     | 
| 
      
 61 
     | 
    
         
            +
            require_paths:
         
     | 
| 
      
 62 
     | 
    
         
            +
            - lib
         
     | 
| 
      
 63 
     | 
    
         
            +
            required_ruby_version: !ruby/object:Gem::Requirement
         
     | 
| 
      
 64 
     | 
    
         
            +
              requirements:
         
     | 
| 
      
 65 
     | 
    
         
            +
              - - ">="
         
     | 
| 
      
 66 
     | 
    
         
            +
                - !ruby/object:Gem::Version
         
     | 
| 
      
 67 
     | 
    
         
            +
                  version: 2.6.0
         
     | 
| 
      
 68 
     | 
    
         
            +
            required_rubygems_version: !ruby/object:Gem::Requirement
         
     | 
| 
      
 69 
     | 
    
         
            +
              requirements:
         
     | 
| 
      
 70 
     | 
    
         
            +
              - - ">="
         
     | 
| 
      
 71 
     | 
    
         
            +
                - !ruby/object:Gem::Version
         
     | 
| 
      
 72 
     | 
    
         
            +
                  version: '0'
         
     | 
| 
      
 73 
     | 
    
         
            +
            requirements: []
         
     | 
| 
      
 74 
     | 
    
         
            +
            rubygems_version: 3.4.13
         
     | 
| 
      
 75 
     | 
    
         
            +
            signing_key:
         
     | 
| 
      
 76 
     | 
    
         
            +
            specification_version: 4
         
     | 
| 
      
 77 
     | 
    
         
            +
            summary: MySQL Spatial Data Types for ActiveRecord
         
     | 
| 
      
 78 
     | 
    
         
            +
            test_files: []
         
     |