Skip to content

Commit

Permalink
Moved MySQL-specific code to separate file
Browse files Browse the repository at this point in the history
  • Loading branch information
ankane committed Oct 5, 2024
1 parent 212025d commit 092fd20
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 33 deletions.
39 changes: 6 additions & 33 deletions lib/neighbor.rb
Original file line number Diff line number Diff line change
@@ -1,38 +1,25 @@
# dependencies
require "active_support"

# modules
# adapter hooks
require_relative "neighbor/mysql"
require_relative "neighbor/postgresql"
require_relative "neighbor/sqlite"

# modules
require_relative "neighbor/reranking"
require_relative "neighbor/sparse_vector"
require_relative "neighbor/sqlite"
require_relative "neighbor/utils"
require_relative "neighbor/version"

module Neighbor
class Error < StandardError; end

module MysqlRegisterTypes
def initialize_type_map(m)
super
register_vector_type(m)
end

def register_vector_type(m)
m.register_type %r(^vector)i do |sql_type|
limit = extract_limit(sql_type)
Type::MysqlVector.new(limit: limit)
end
end
end
end

ActiveSupport.on_load(:active_record) do
require_relative "neighbor/attribute"
require_relative "neighbor/model"
require_relative "neighbor/normalized_attribute"
require_relative "neighbor/type/mysql_vector"
require_relative "neighbor/type/sqlite_vector"

extend Neighbor::Model

Expand All @@ -42,21 +29,7 @@ def register_vector_type(m)
# tries to load pg gem, which may not be available
end

require "active_record/connection_adapters/abstract_mysql_adapter"

# ensure schema can be dumped
ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter::NATIVE_DATABASE_TYPES[:vector] = {name: "vector"}

# ensure schema can be loaded
unless ActiveRecord::ConnectionAdapters::TableDefinition.method_defined?(:vector)
ActiveRecord::ConnectionAdapters::TableDefinition.send(:define_column_methods, :vector)
end

# prevent unknown OID warning
ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter.singleton_class.prepend(Neighbor::MysqlRegisterTypes)
if ActiveRecord::VERSION::STRING.to_f < 7.1
ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter.register_vector_type(ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter::TYPE_MAP)
end
Neighbor::MySQL.initialize!
end

require_relative "neighbor/railtie" if defined?(Rails::Railtie)
37 changes: 37 additions & 0 deletions lib/neighbor/mysql.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
module Neighbor
module MySQL
def self.initialize!
require_relative "type/mysql_vector"

require "active_record/connection_adapters/abstract_mysql_adapter"

# ensure schema can be dumped
ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter::NATIVE_DATABASE_TYPES[:vector] = {name: "vector"}

# ensure schema can be loaded
unless ActiveRecord::ConnectionAdapters::TableDefinition.method_defined?(:vector)
ActiveRecord::ConnectionAdapters::TableDefinition.send(:define_column_methods, :vector)
end

# prevent unknown OID warning
ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter.singleton_class.prepend(RegisterTypes)
if ActiveRecord::VERSION::STRING.to_f < 7.1
ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter.register_vector_type(ActiveRecord::ConnectionAdapters::AbstractMysqlAdapter::TYPE_MAP)
end
end

module RegisterTypes
def initialize_type_map(m)
super
register_vector_type(m)
end

def register_vector_type(m)
m.register_type %r(^vector)i do |sql_type|
limit = extract_limit(sql_type)
Type::MysqlVector.new(limit: limit)
end
end
end
end
end
1 change: 1 addition & 0 deletions lib/neighbor/sqlite.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
module Neighbor
module SQLite
def self.initialize!
require_relative "type/sqlite_vector"
require "sqlite_vec"
require "active_record/connection_adapters/sqlite3_adapter"

Expand Down

0 comments on commit 092fd20

Please sign in to comment.