Class: AIRecordFinder::DSLParser
- Inherits:
-
Object
- Object
- AIRecordFinder::DSLParser
- 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
- #call ⇒ Object
-
#initialize(model:, schema:, dsl:, max_limit:) ⇒ DSLParser
constructor
A new instance of DSLParser.
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
#call ⇒ Object
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 |