Class: AIRecordFinder::DSLParser

Inherits:
Object
  • Object
show all
Defined in:
lib/ai_record_finder/dsl_parser.rb

Overview

Validates and normalizes the AI-generated query DSL.

Constant Summary collapse

ALLOWED_TOP_LEVEL_KEYS =
%w[filters limit sort joins].freeze
ALLOWED_OPERATORS =
%w[eq gt lt gte lte between in like].freeze
ALLOWED_SORT_DIRECTIONS =
%w[asc desc].freeze

Instance Method Summary collapse

Constructor Details

#initialize(model:, schema:, dsl:, max_limit:) ⇒ DSLParser

Returns a new instance of DSLParser.



10
11
12
13
14
15
16
17
18
# File 'lib/ai_record_finder/dsl_parser.rb', line 10

def initialize(model:, schema:, dsl:, max_limit:)
  @model = model
  @schema = schema
  @dsl = dsl
  @max_limit = max_limit
  @columns = @schema.fetch(:columns).keys
  @associations = @schema.fetch(:associations).keys
  @association_columns = @schema.fetch(:association_columns, {})
end

Instance Method Details

#callObject

Raises:



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/ai_record_finder/dsl_parser.rb', line 20

def call
  raise InvalidDSL, "DSL must be a JSON object" unless @dsl.is_a?(Hash)

  dsl = deep_stringify_keys(@dsl)
  validate_top_level_keys!(dsl)

  filters = validate_filters!(dsl.fetch("filters", []))
  limit = validate_limit!(dsl.fetch("limit", @max_limit))
  sort = validate_sort!(dsl["sort"])
  joins = validate_joins!(dsl.fetch("joins", []))

  {
    "filters" => filters,
    "limit" => limit,
    "sort" => sort,
    "joins" => joins
  }
end