Module: Legion::Data::Vector

Defined in:
lib/legion/data/vector.rb

Class Method Summary collapse

Class Method Details

.available?Boolean

Returns:

  • (Boolean)


7
8
9
10
11
12
13
14
# File 'lib/legion/data/vector.rb', line 7

def available?
  return false unless Legion::Data.connection
  return false unless Legion::Data.connection.adapter_scheme == :postgres

  Legion::Data.connection.fetch("SELECT 1 FROM pg_extension WHERE extname = 'vector'").any?
rescue StandardError
  false
end

.cosine_search(table:, column:, query_vector:, limit: 10, min_similarity: 0.0) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/legion/data/vector.rb', line 27

def cosine_search(table:, column:, query_vector:, limit: 10, min_similarity: 0.0)
  return [] unless available?

  Legion::Logging.debug "Vector cosine_search: table=#{table} column=#{column} limit=#{limit}" if defined?(Legion::Logging)
  vec_literal = vector_literal(query_vector)
  ds = Legion::Data.connection[table]
                   .select_all
                   .select_append(Sequel.lit("1 - (#{column} <=> ?)", vec_literal).as(:similarity))
                   .order(Sequel.lit("#{column} <=> ?", vec_literal))
                   .limit(limit)

  ds = ds.where(Sequel.lit("1 - (#{column} <=> ?) >= ?", vec_literal, min_similarity)) if min_similarity.positive?
  ds.all
end

.ensure_extension!Object



16
17
18
19
20
21
22
23
24
25
# File 'lib/legion/data/vector.rb', line 16

def ensure_extension!
  return false unless Legion::Data.connection&.adapter_scheme == :postgres

  Legion::Data.connection.run('CREATE EXTENSION IF NOT EXISTS vector')
  Legion::Logging.info 'pgvector extension enabled' if defined?(Legion::Logging)
  true
rescue StandardError => e
  Legion::Logging.warn("pgvector extension creation failed: #{e.message}") if defined?(Legion::Logging)
  false
end

.l2_search(table:, column:, query_vector:, limit: 10) ⇒ Object



42
43
44
45
46
47
48
49
50
51
52
53
# File 'lib/legion/data/vector.rb', line 42

def l2_search(table:, column:, query_vector:, limit: 10)
  return [] unless available?

  Legion::Logging.debug "Vector l2_search: table=#{table} column=#{column} limit=#{limit}" if defined?(Legion::Logging)
  vec_literal = vector_literal(query_vector)
  Legion::Data.connection[table]
              .select_all
              .select_append(Sequel.lit("#{column} <-> ?", vec_literal).as(:distance))
              .order(Sequel.lit("#{column} <-> ?", vec_literal))
              .limit(limit)
              .all
end