Class: AdvancedQueryBuilder

Inherits:
Object
  • Object
show all
Defined in:
common/advanced_query_builder.rb

Defined Under Namespace

Classes: RangeValue

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeAdvancedQueryBuilder

Returns a new instance of AdvancedQueryBuilder.



9
10
11
# File 'common/advanced_query_builder.rb', line 9

def initialize
  @query = nil
end

Instance Attribute Details

#queryObject (readonly)

Returns the value of attribute query



5
6
7
# File 'common/advanced_query_builder.rb', line 5

def query
  @query
end

Class Method Details

.as_field_query(query_data) ⇒ Object



146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
# File 'common/advanced_query_builder.rb', line 146

def self.as_field_query(query_data)
  raise "keys should be strings only" if query_data.is_a?(Hash) && query_data.any? { |k, _| k.is_a? Symbol }
  if query_data.is_a?(JSONModelType)
    query_data
  elsif query_data['type'] == "date"
    query_precision = query_data['value'].split('-').count
    case query_precision
    when 3 then query_data['precision'] = "day"
    when 2 then query_data['precision'] = "month"
    when 1 then query_data['precision'] = "year"
    end

    query_data['value'] = JSONModel::Validations.normalise_date(query_data['value'])
    JSONModel::JSONModel(:date_field_query).from_hash(query_data)
  elsif query_data['type'] == "boolean"
    JSONModel::JSONModel(:boolean_field_query).from_hash(query_data)
  elsif query_data['type'] == "range"
    JSONModel::JSONModel(:range_query).from_hash(query_data)
  else
    if query_data["type"] == "enum" && query_data["value"].blank?
      query_data["comparator"] = "empty"
    end

    # Looks like sometimes the value is set to a Boolean, but :field_query
    # schema insists this should be a String.
    query_data["value"] = query_data["value"].to_s
    query = JSONModel::JSONModel(:field_query).from_hash(query_data)

    if query_data['type'] == "enum"
      query.literal = true
    end

    query
  end
end

.build_query_from_form(queries) ⇒ Object



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'common/advanced_query_builder.rb', line 59

def self.build_query_from_form(queries)
  query = if queries.length > 1
            stack = queries.reverse.clone

            while stack.length > 1
              a = stack.pop
              b = stack.pop

              stack.push(JSONModel::JSONModel(:boolean_query).from_hash({
                                                               :op => b["op"],
                                                               :subqueries => [as_field_query(a), as_field_query(b)]
                                                             }))
            end

            stack.pop
          else
            as_field_query(queries[0])
          end

  JSONModel::JSONModel(:advanced_query).from_hash({"query" => query})
end

.from_json_filter_terms(array_of_json) ⇒ Object



48
49
50
51
52
53
54
55
56
57
# File 'common/advanced_query_builder.rb', line 48

def self.from_json_filter_terms(array_of_json)
  builder = new

  array_of_json.each do |json_str|
    json = ASUtils.json_parse(json_str)
    builder.and(json.keys[0], json.values[0])
  end

  builder.build
end

Instance Method Details

#and(field_or_subquery, value = nil, type = 'text', literal = false, negated = false) ⇒ Object



13
14
15
16
17
18
19
20
21
22
23
24
# File 'common/advanced_query_builder.rb', line 13

def and(field_or_subquery, value = nil, type = 'text', literal = false, negated = false)
  if field_or_subquery.is_a?(AdvancedQueryBuilder)
    push_subquery('AND', field_or_subquery)
  elsif value.is_a? RangeValue
    push_range('AND', field_or_subquery, value, 'range', literal, negated)
  else
    raise "Missing value" if value.nil?
    push_term('AND', field_or_subquery, value, type, literal, negated)
  end

  self
end

#buildObject



44
45
46
# File 'common/advanced_query_builder.rb', line 44

def build
  JSONModel::JSONModel(:advanced_query).from_hash({"query" => build_query(@query)})
end

#empty?Boolean Also known as: empty

Returns:

  • (Boolean)


39
40
41
# File 'common/advanced_query_builder.rb', line 39

def empty?
  @query.nil?
end

#or(field_or_subquery, value = nil, type = 'text', literal = false, negated = false) ⇒ Object



26
27
28
29
30
31
32
33
34
35
36
37
# File 'common/advanced_query_builder.rb', line 26

def or(field_or_subquery, value = nil, type = 'text', literal = false, negated = false)
  if field_or_subquery.is_a?(AdvancedQueryBuilder)
    push_subquery('OR', field_or_subquery)
  elsif value.is_a? RangeValue
    push_range('AND', field_or_subquery, value, 'range', literal, negated)
  else
    raise "Missing value" unless value
    push_term('OR', field_or_subquery, value, type, literal, negated)
  end

  self
end