Module: Queries::Concerns::DataAttributes
- Extended by:
- ActiveSupport::Concern
- Includes:
- Helpers
- Included in:
- BiologicalAssociationsGraph::Filter, Queries::CollectingEvent::Filter, Otu::Filter, Person::Filter, Serial::Filter
- Defined in:
- lib/queries/concerns/data_attributes.rb
Overview
Linking DataAttribute to queries that reference DataAttributes
For filter queries: !! requires a `base_query` method ?! … or not !! requires `set_data_attributes_params` be called in initialize()
Class Method Summary collapse
-
.merge_clauses ⇒ Object
TODO: this as class method is bad, it prevents us from adding optimizing logic that restricts the number of clauses.
- .params ⇒ Object
Instance Method Summary collapse
- #data_attribute_exact_pair_facet ⇒ Object
- #data_attribute_predicate_id_facet ⇒ Object
- #data_attribute_table ⇒ Arel::Table
- #data_attribute_wildcard_pair_facet ⇒ Object
- #data_attribute_without_predicate_id_facet ⇒ Object
- #data_attributes_facet ⇒ Object
- #set_data_attributes_params(params) ⇒ Object
- #value_facet ⇒ Object
-
#wildcard_value(value) ⇒ Object
TODO: get rid of this.
Methods included from Helpers
Class Method Details
.merge_clauses ⇒ Object
TODO: this as class method is bad,
it prevents us from adding optimizing logic
that restricts the number of clauses
226 227 228 229 230 231 232 233 234 235 |
# File 'lib/queries/concerns/data_attributes.rb', line 226 def self.merge_clauses [ :data_attribute_exact_pair_facet, :data_attribute_predicate_id_facet, :data_attribute_wildcard_pair_facet, :data_attribute_without_predicate_id_facet, :data_attributes_facet, :value_facet ] end |
.params ⇒ Object
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
# File 'lib/queries/concerns/data_attributes.rb', line 10 def self.params [ :data_attributes, :data_attribute_predicate_id, :data_attribute_without_predicate_id, :data_attribute_exact_value, :data_attribute_wildcard_value, :data_attribute_exact_pair, :data_attribute_wildcard_pair, data_attribute_predicate_id: [], data_attribute_without_predicate_id: [], data_attribute_exact_value: [], data_attribute_wildcard_value: [], data_attribute_exact_pair: [], data_attribute_wildcard_pair: [], ] end |
Instance Method Details
#data_attribute_exact_pair_facet ⇒ Object
200 201 202 203 204 205 206 207 208 209 210 211 212 |
# File 'lib/queries/concerns/data_attributes.rb', line 200 def data_attribute_exact_pair_facet return nil if data_attribute_exact_pair.blank? a = [] data_attribute_exact_pair.each do |k,v| a.push data_attribute_table[:controlled_vocabulary_term_id].eq(k).and( data_attribute_table[:value].eq(v) ) end w = a.shift a.each do |c| w = w.or(c) end referenced_klass.joins(:data_attributes).where(w) end |
#data_attribute_predicate_id_facet ⇒ Object
139 140 141 142 |
# File 'lib/queries/concerns/data_attributes.rb', line 139 def data_attribute_predicate_id_facet return nil if data_attribute_predicate_id.blank? referenced_klass.joins(:data_attributes).where(data_attributes: {controlled_vocabulary_term_id: data_attribute_predicate_id}) end |
#data_attribute_table ⇒ Arel::Table
135 136 137 |
# File 'lib/queries/concerns/data_attributes.rb', line 135 def data_attribute_table ::DataAttribute.arel_table end |
#data_attribute_wildcard_pair_facet ⇒ Object
186 187 188 189 190 191 192 193 194 195 196 197 198 |
# File 'lib/queries/concerns/data_attributes.rb', line 186 def data_attribute_wildcard_pair_facet return nil if data_attribute_wildcard_pair.blank? a = [] data_attribute_wildcard_pair.each do |k,v| a.push data_attribute_table[:controlled_vocabulary_term_id].eq(k).and( data_attribute_table[:value].matches(wildcard_value(v)) ) end w = a.shift a.each do |c| w = w.or(c) end referenced_klass.joins(:data_attributes).where(w) end |
#data_attribute_without_predicate_id_facet ⇒ Object
144 145 146 147 148 149 150 151 152 153 154 |
# File 'lib/queries/concerns/data_attributes.rb', line 144 def data_attribute_without_predicate_id_facet return nil if data_attribute_without_predicate_id.blank? not_these = referenced_klass.left_joins(:data_attributes).where(data_attributes: {controlled_vocabulary_term_id: data_attribute_without_predicate_id}) # a Not exists without using .exists s = 'WITH not_these AS (' + not_these.to_sql + ') ' + referenced_klass.joins("LEFT JOIN not_these AS not_these1 ON not_these1.id = #{table.name}.id") .where('not_these1.id IS NULL').to_sql referenced_klass.from("(#{s}) as #{table.name}") end |
#data_attributes_facet ⇒ Object
214 215 216 217 218 219 220 221 |
# File 'lib/queries/concerns/data_attributes.rb', line 214 def data_attributes_facet return nil if data_attributes.nil? if data_attributes referenced_klass.joins(:data_attributes).distinct else referenced_klass.where.missing(:data_attributes) end end |
#set_data_attributes_params(params) ⇒ Object
123 124 125 126 127 128 129 130 131 132 |
# File 'lib/queries/concerns/data_attributes.rb', line 123 def set_data_attributes_params(params) @data_attribute_predicate_id = params[:data_attribute_predicate_id] @data_attribute_without_predicate_id = params[:data_attribute_without_predicate_id] @data_attribute_exact_value = params[:data_attribute_exact_value] @data_attribute_wildcard_value = params[:data_attribute_wildcard_value] @data_attribute_exact_pair = params[:data_attribute_exact_pair] @data_attribute_wildcard_pair = params[:data_attribute_wildcard_pair] @data_attributes = boolean_param(params, :data_attributes) end |
#value_facet ⇒ Object
161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 |
# File 'lib/queries/concerns/data_attributes.rb', line 161 def value_facet return nil if data_attribute_exact_value.blank? && data_attribute_wildcard_value.blank? a,b = nil, nil if data_attribute_wildcard_value.present? v = self.data_attribute_wildcard_value.collect{|a| wildcard_value(a) } # TODO: should be standardized much earlier on a = data_attribute_table[:value].matches_any(v) end b = data_attribute_table[:value].eq_any(data_attribute_exact_value) if data_attribute_exact_value.present? q = referenced_klass.joins(:data_attributes) if a && b q.where(a.or(b)) elsif a q.where(a) elsif b q.where(b) else nil end end |
#wildcard_value(value) ⇒ Object
TODO: get rid of this
157 158 159 |
# File 'lib/queries/concerns/data_attributes.rb', line 157 def wildcard_value(value) '%' + value.to_s.strip.gsub(/\s+/, '%') + '%' end |