diff options
| author | mo <mo@mokhan.ca> | 2019-06-15 10:37:46 -0600 |
|---|---|---|
| committer | mo <mo@mokhan.ca> | 2019-06-15 10:37:46 -0600 |
| commit | 62b75355c1ac8c575b08940a426c42f93724ace1 (patch) | |
| tree | a50a569b84472c08573dd972103ac38f6655dfea | |
| parent | 8850284872e2cd53e25845a627eb318dd5166117 (diff) | |
extract visit methods
| -rw-r--r-- | app/models/scim/visitor.rb | 78 |
1 files changed, 65 insertions, 13 deletions
diff --git a/app/models/scim/visitor.rb b/app/models/scim/visitor.rb index 52b927e..1a1a110 100644 --- a/app/models/scim/visitor.rb +++ b/app/models/scim/visitor.rb @@ -12,36 +12,88 @@ module Scim def visit(node) case node.operator when :and - visit(node.left).merge(visit(node.right)) + visit_and(node) when :or - visit(node.left).or(visit(node.right)) + visit_or(node) when :eq - @clazz.where(attr_for(node) => node.value) + visit_equals(node) when :ne - @clazz.where.not(attr_for(node) => node.value) + visit_not_equals(node) when :co - @clazz.where("#{attr_for(node)} LIKE ?", "%#{escape_sql_wildcards(node.value)}%") + visit_contains(node) when :sw - @clazz.where("#{attr_for(node)} LIKE ?", "#{escape_sql_wildcards(node.value)}%") + visit_starts_with(node) when :ew - @clazz.where("#{attr_for(node)} LIKE ?", "%#{escape_sql_wildcards(node.value)}") + visit_ends_with(node) when :gt - @clazz.where("#{attr_for(node)} > ?", cast_value_from(node)) + visit_greater_than(node) when :ge - @clazz.where("#{attr_for(node)} >= ?", cast_value_from(node)) + visit_greater_than_equals(node) when :lt - @clazz.where("#{attr_for(node)} < ?", cast_value_from(node)) + visit_less_than(node) when :le - @clazz.where("#{attr_for(node)} <= ?", cast_value_from(node)) + visit_less_than_equals(node) when :pr - @clazz.where.not(attr_for(node) => nil) + visit_presence(node) else - @clazz.none + visit_unknown(node) end end private + def visit_and(node) + visit(node.left).merge(visit(node.right)) + end + + def visit_or(node) + visit(node.left).or(visit(node.right)) + end + + def visit_equals(node) + @clazz.where(attr_for(node) => node.value) + end + + def visit_not_equals(node) + @clazz.where.not(attr_for(node) => node.value) + end + + def visit_contains(node) + @clazz.where("#{attr_for(node)} LIKE ?", "%#{escape_sql_wildcards(node.value)}%") + end + + def visit_starts_with(node) + @clazz.where("#{attr_for(node)} LIKE ?", "#{escape_sql_wildcards(node.value)}%") + end + + def visit_ends_with(node) + @clazz.where("#{attr_for(node)} LIKE ?", "%#{escape_sql_wildcards(node.value)}") + end + + def visit_greater_than(node) + @clazz.where("#{attr_for(node)} > ?", cast_value_from(node)) + end + + def visit_greater_than_equals(node) + @clazz.where("#{attr_for(node)} >= ?", cast_value_from(node)) + end + + def visit_less_than(node) + @clazz.where("#{attr_for(node)} < ?", cast_value_from(node)) + end + + def visit_less_than_equals(node) + @clazz.where("#{attr_for(node)} <= ?", cast_value_from(node)) + end + + def visit_presence(node) + @clazz.where.not(attr_for(node) => nil) + end + + def visit_unknown(_node) + @clazz.none + end + def cast_value_from(node) case @clazz.columns_hash[attr_for(node).to_s].type when :datetime |
