Class: Ddr::Index::QueryClause

Inherits:
Object
  • Object
show all
Defined in:
lib/ddr/index/query_clause.rb

Constant Summary collapse

ANY_FIELD =
Field.new('*').freeze
ANY_VALUE =
"[* TO *]"
QUOTE =
'"'
TERM_QUERY =
"{!term f=%{field}}%{value}"
STANDARD_QUERY =
"%{field}:%{value}"
NEGATIVE_QUERY =
"-%{field}:%{value}"
DISJUNCTION =
"{!lucene q.op=OR df=%{field}}%{value}"

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.absent(field) ⇒ Object

Builds a query clause to filter where field is NOT present (no values)



68
69
70
# File 'lib/ddr/index/query_clause.rb', line 68

def absent(field)
  new(field: field, value: ANY_VALUE, template: NEGATIVE_QUERY)
end

.before(field, value) ⇒ Object Also known as: before_date_time

Builds a query clause to filter where date field value is earlier than a date/time value.



79
80
81
# File 'lib/ddr/index/query_clause.rb', line 79

def before(field, value)
  new(field: field, value: "[* TO %s]" % Ddr::Utils.solr_date(value))
end

.before_days(field, value) ⇒ Object

Builds a query clause to filter where date field value is earlier than a number of days before now.



85
86
87
# File 'lib/ddr/index/query_clause.rb', line 85

def before_days(field, value)
  new(field: field, value: "[* TO NOW-%iDAYS]" % value)
end

.disjunction(field, values) ⇒ Object

Builds a query clause to filter where field contains at least one of a set of values.



73
74
75
76
# File 'lib/ddr/index/query_clause.rb', line 73

def disjunction(field, values)
  value = values.map { |v| quote(v) }.join(" ")
  new(field: field, value: value, template: DISJUNCTION)
end

.negative(field, value) ⇒ Object

Builds a query clause to filter where field does not have the given value.



58
59
60
# File 'lib/ddr/index/query_clause.rb', line 58

def negative(field, value)
  new(field: field, value: value, template: NEGATIVE_QUERY, quote_value: true)
end

.present(field) ⇒ Object

Builds a query clause to filter where field is present (i.e, has any value)



63
64
65
# File 'lib/ddr/index/query_clause.rb', line 63

def present(field)
  new(field: field, value: ANY_VALUE)
end

.quote(value) ⇒ Object



33
34
35
36
37
38
39
40
# File 'lib/ddr/index/query_clause.rb', line 33

def quote(value)
  # Derived from Blacklight::Solr::SearchBuilderBehavior#solr_param_quote
  unless value =~ /\A[a-zA-Z0-9$_\-\^]+\z/
    QUOTE + value.gsub("'", "\\\\\'").gsub('"', "\\\\\"") + QUOTE
  else
    value
  end
end

.term(field, value) ⇒ Object

Builds a “term query” clause to filter where field contains value.



90
91
92
# File 'lib/ddr/index/query_clause.rb', line 90

def term(field, value)
  new(field: field, value: value, template: TERM_QUERY)
end

.unique_key(value) ⇒ Object Also known as: id

Builds a query clause to retrieve the index document by unique key.



43
44
45
# File 'lib/ddr/index/query_clause.rb', line 43

def unique_key(value)
  term(UniqueKeyField.instance, value)
end

.where(field, value) ⇒ Object



48
49
50
51
52
53
54
55
# File 'lib/ddr/index/query_clause.rb', line 48

def where(field, value)
   values = Array(value)
  if values.size > 1
    disjunction(field, values)
  else
    new(field: field, value: values.first, quote_value: true)
  end
end

Instance Method Details

#quote(value) ⇒ Object



27
28
29
# File 'lib/ddr/index/query_clause.rb', line 27

def quote(value)
  self.class.quote(value)
end

#to_sObject



23
24
25
# File 'lib/ddr/index/query_clause.rb', line 23

def to_s
  template % { field: field, value: quote_value ? quote(value) : value }
end