Module: ParadeDB::SearchMethods::PredicateInspector

Defined in:
lib/parade_db/search_methods.rb

Constant Summary collapse

PARADEDB_INFIX_OPERATORS =
%w[&&& ||| ### @@@ === ## ##>].freeze
PARADEDB_SQL_PATTERN =
/(&&&|\|\|\||###|@@@|===|##>|##|pdb\.)/

Class Method Summary collapse

Class Method Details

.contains_paradedb_predicate?(node) ⇒ Boolean

Returns:

  • (Boolean)


59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
# File 'lib/parade_db/search_methods.rb', line 59

def contains_paradedb_predicate?(node)
  case node
  when nil
    false
  when ::Array
    node.any? { |child| contains_paradedb_predicate?(child) }
  when ::Arel::Nodes::InfixOperation
    PARADEDB_INFIX_OPERATORS.include?(node.operator.to_s) ||
      contains_paradedb_predicate?(node.left) ||
      contains_paradedb_predicate?(node.right)
  when ::Arel::Nodes::NamedFunction
    node.name.to_s.start_with?("pdb.") ||
      node.expressions.any? { |expr| contains_paradedb_predicate?(expr) }
  when ::Arel::Nodes::SqlLiteral
    node.to_s.match?(PARADEDB_SQL_PATTERN)
  when ::Arel::Nodes::Grouping
    contains_paradedb_predicate?(node.expr)
  when ::Arel::Nodes::And
    node.children.any? { |child| contains_paradedb_predicate?(child) }
  when ::Arel::Nodes::Or
    contains_paradedb_predicate?(node.left) || contains_paradedb_predicate?(node.right)
  when ::Arel::Nodes::Not
    contains_paradedb_predicate?(node.expr)
  when ::Arel::Nodes::Node
    # Custom ParadeDB nodes
    node.class.name.start_with?("ParadeDB::") ||
      (node.respond_to?(:expr) && contains_paradedb_predicate?(node.expr)) ||
      (node.respond_to?(:left) && contains_paradedb_predicate?(node.left)) ||
      (node.respond_to?(:right) && contains_paradedb_predicate?(node.right))
  else
    false
  end
end

.relation_has_paradedb_predicate?(relation) ⇒ Boolean

Returns:

  • (Boolean)


54
55
56
57
# File 'lib/parade_db/search_methods.rb', line 54

def relation_has_paradedb_predicate?(relation)
  return false unless relation
  contains_paradedb_predicate?(relation.where_clause&.ast)
end