Class: MARC::Spec::Queries::Query

Inherits:
Object
  • Object
show all
Includes:
Part
Defined in:
lib/marc/spec/queries/query.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from Part

#eql?, #hash, #inspect

Constructor Details

#initialize(tag: nil, selector: nil, condition: nil, subqueries: []) ⇒ Query

TODO: separate factory methods for possible cases? (see transform.rb) TODO: separate query (w/o subqueries) from wrapper w/subqueries?



13
14
15
16
17
18
19
# File 'lib/marc/spec/queries/query.rb', line 13

def initialize(tag: nil, selector: nil, condition: nil, subqueries: [])
  @tag = ensure_type(tag, Tag, allow_nil: true)
  # TODO: do we need the Selector interface at all?
  @selector = ensure_type(selector, Applicable, allow_nil: true)
  @condition = ensure_type(condition, Condition, allow_nil: true)
  @subqueries = subqueries.map { |sq| ensure_type(sq, Query) }
end

Instance Attribute Details

#conditionObject (readonly)

Returns the value of attribute condition.



9
10
11
# File 'lib/marc/spec/queries/query.rb', line 9

def condition
  @condition
end

#selectorObject (readonly)

Returns the value of attribute selector.



9
10
11
# File 'lib/marc/spec/queries/query.rb', line 9

def selector
  @selector
end

#subqueriesObject (readonly)

Returns the value of attribute subqueries.



9
10
11
# File 'lib/marc/spec/queries/query.rb', line 9

def subqueries
  @subqueries
end

#tagObject (readonly)

Returns the value of attribute tag.



9
10
11
# File 'lib/marc/spec/queries/query.rb', line 9

def tag
  @tag
end

Instance Method Details

#execute(executor, context_fields, context_result = nil) ⇒ Object

TODO: don’t support nested subqueries



35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/marc/spec/queries/query.rb', line 35

def execute(executor, context_fields, context_result = nil)
  fields = tag ? executor.apply_tag(tag) : context_fields
  return [] if fields.empty?

  field_results = root_results(fields, executor, context_result)
  return field_results if subqueries.empty?

  fields.each_with_object([]) do |field, results|
    subqueries.each do |subquery|
      subquery_results = subquery.execute(executor, [field])
      results.concat(subquery_results)
    end
  end
end

#tag_strObject



21
22
23
# File 'lib/marc/spec/queries/query.rb', line 21

def tag_str
  tag.to_s if tag
end

#to_sObject



25
26
27
28
29
30
31
32
# File 'lib/marc/spec/queries/query.rb', line 25

def to_s
  StringIO.new.tap do |out|
    out << tag if tag
    out << selector if selector
    out << "{#{condition}}" if condition
    out << subqueries.join
  end.string
end