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}"
REGEXP_QUERY =
"%{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.



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

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.



95
96
97
# File 'lib/ddr/index/query_clause.rb', line 95

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

.join(from:, to:, where:) ⇒ Object

Builds a Solr join clause



80
81
82
83
84
85
86
# File 'lib/ddr/index/query_clause.rb', line 80

def join(from:, to:, where:)
  field, value = where.to_a.first
  from_field = FieldAttribute.coerce(from)
  to_field   = FieldAttribute.coerce(to)
  template = "{!join from=#{from_field} to=#{to_field}}%{field}:%{value}"
  new(field: field, value: value, template: template, quote_value: true)
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

.regexp(field, value) ⇒ Object

Builds a regular expression query clause



105
106
107
108
# File 'lib/ddr/index/query_clause.rb', line 105

def regexp(field, value)
  val = value.gsub(/\//, "\\/")
  new(field: field, value: val, template: REGEXP_QUERY)
end

.term(field, value) ⇒ Object

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



100
101
102
# File 'lib/ddr/index/query_clause.rb', line 100

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



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

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

#to_sObject



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

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