module ROM::LDAP::Dataset::DSL

AST Query Interface

@api private

Public Instance Methods

above(args)
Alias for: gt
approx(args) click to toggle source

@param args [Hash]

@return [Dataset]

# File lib/rom/ldap/dataset/dsl.rb, line 173
def approx(args)
  chain(:op_prx, *args.to_a[0])
end
begins(args) click to toggle source

Starts with filter

@param args [Hash]

@return [Dataset]

# File lib/rom/ldap/dataset/dsl.rb, line 116
def begins(args)
  chain(*match_dsl(args, right: WILDCARD))
end
below(args)
Alias for: lt
between(args)
Alias for: within
binary_equal(args) click to toggle source

@param args [Hash]

@return [Dataset]

# File lib/rom/ldap/dataset/dsl.rb, line 166
def binary_equal(args)
  chain(:op_bineq, *args.to_a[0])
end
bitwise(args) click to toggle source

@param args [Hash]

@return [Dataset]

# File lib/rom/ldap/dataset/dsl.rb, line 180
def bitwise(args)
  chain(:op_ext, *args.to_a[0])
end
contains(args) click to toggle source

@param args [Hash]

@return [Dataset]

# File lib/rom/ldap/dataset/dsl.rb, line 132
def contains(args)
  chain(*match_dsl(args, left: WILDCARD, right: WILDCARD))
end
Also aliased as: matches
ends(args) click to toggle source

Ends with filter

@param args [Hash]

@return [Dataset]

# File lib/rom/ldap/dataset/dsl.rb, line 125
def ends(args)
  chain(*match_dsl(args, left: WILDCARD))
end
equal(args) click to toggle source

Equality filter aliased as 'where'.

@example

relation.where(uid: 'Pietro')
relation.where(uid: %w[Pietro Wanda])
relation.where(uid: 'Pietro', sn: 'Maximoff')

@param args [Hash]

@return [Dataset]

# File lib/rom/ldap/dataset/dsl.rb, line 28
def equal(args)
  chain(*array_dsl(args))
end
excludes(args) click to toggle source

negate contains

@param args [Hash]

@return [Dataset]

# File lib/rom/ldap/dataset/dsl.rb, line 142
def excludes(args)
  chain(:con_not, match_dsl(args, left: WILDCARD, right: WILDCARD))
end
gt(args) click to toggle source

Greater than filter

@param args [Hash]

@return [Dataset]

# File lib/rom/ldap/dataset/dsl.rb, line 78
def gt(args)
  chain(:con_not, [:op_lte, *args.to_a[0]])
end
Also aliased as: above
gte(args) click to toggle source

Greater than or equal filter

@param args [Hash]

@return [Dataset]

# File lib/rom/ldap/dataset/dsl.rb, line 98
def gte(args)
  chain(:op_gte, *args.to_a[0])
end
has(attribute)
Alias for: present
hasnt(attribute)
Alias for: missing
inverse() click to toggle source

Invert the whole query

@return [Dataset]

# File lib/rom/ldap/dataset/dsl.rb, line 14
def inverse
  with(criteria: [:con_not, criteria])
end
lt(args) click to toggle source

Less than filter

@param args [Hash]

@return [Dataset]

# File lib/rom/ldap/dataset/dsl.rb, line 88
def lt(args)
  chain(:con_not, [:op_gte, *args.to_a[0]])
end
Also aliased as: below
lte(args) click to toggle source

Less than or equal filter

@param args [Hash]

@return [Dataset]

# File lib/rom/ldap/dataset/dsl.rb, line 107
def lte(args)
  chain(:op_lte, *args.to_a[0])
end
matches(args)
Alias for: contains
missing(attribute) click to toggle source

Absence filter aliased as 'hasnt'. Inverse of 'present'.

@example

relation.missing(:uid)
relation.hasnt(:mail)

@param attribute [Symbol]

@return [Dataset]

# File lib/rom/ldap/dataset/dsl.rb, line 68
def missing(attribute)
  chain(:con_not, [:op_eql, attribute, :wildcard])
end
Also aliased as: hasnt
outside(args) click to toggle source

negate outside

@param args [Range]

@return [Dataset]

# File lib/rom/ldap/dataset/dsl.rb, line 159
def outside(args)
  chain(:con_not, [:con_and, cover_dsl(args)])
end
present(attribute) click to toggle source

Presence filter aliased as 'has'.

@example

relation.present(:uid)
relation.has(:mail)

@param attribute [Symbol]

@return [Dataset]

# File lib/rom/ldap/dataset/dsl.rb, line 54
def present(attribute)
  chain(:op_eql, attribute, :wildcard)
end
Also aliased as: has
unequal(args) click to toggle source

Antonym of 'equal'

@example

relation.unequal(uid: 'Pietro')
relation.unequal(uid: %w[Pietro Wanda])

@param args [Hash]

@return [Dataset]

# File lib/rom/ldap/dataset/dsl.rb, line 41
def unequal(args)
  chain(:con_not, array_dsl(args))
end
within(args) click to toggle source

@param args [Range]

@return [Dataset]

# File lib/rom/ldap/dataset/dsl.rb, line 149
def within(args)
  chain(:con_and, cover_dsl(args))
end
Also aliased as: between

Private Instance Methods

array_dsl(args) click to toggle source

Handle multiple criteria with an OR join.

@see #chain for AND join.

@param args [Hash]

@return [Array] AST

@example

array_dsl(sn: 'Maximoff', gn: %w[Wanda Pietror])
=>
    [ :con_or,
      [
        [ :op_eql, :sn, "Maximoff" ],
        [ :con_or,
          [
            [ :op_eql, :gn, "Wanda" ],
            [ :op_eql, :gn, "Pietror" ]
          ]
        ]
      ]
    ]
# File lib/rom/ldap/dataset/dsl.rb, line 225
def array_dsl(args)
  expressions = args.map do |left, right|
    values = Array(right).map { |v| [:op_eql, left, escape(v)] }
    join_dsl(:con_or, values)
  end
  join_dsl(:con_or, expressions)

  # join_dsl(:con_or, [ match_dsl(args.map(&:to_a)) ])
  # join_dsl(:con_or, args.map { |arg| match_dsl([arg]) })
end
chain(*exprs) click to toggle source

Update the criteria.

If criteria already exist join with AND.

@example

chain(:op_eql, :uid,  "*foo*")

@param exprs [Mixed] AST built by QueryDSL

@return [Dataset]

# File lib/rom/ldap/dataset/dsl.rb, line 195
def chain(*exprs)
  if criteria.empty?
    with(criteria: exprs)
  else
    with(criteria: [:con_and, [criteria, exprs]])
  end
end
cover_dsl(args) click to toggle source

@param args [Range,Array]

@return [Array]

# File lib/rom/ldap/dataset/dsl.rb, line 274
def cover_dsl(args)
  attribute, range = args.to_a[0]
  lower, *_, upper = range.to_a

  lower = [:op_gte, attribute, lower]
  upper = [:op_lte, attribute, upper]

  [lower, upper]
end
escape(value) click to toggle source

If any of the following special characters appear in the search filter as literals, they must be escaped with a backslash.

“(”, “)”, “", ,”/“ ”*“, ”null“

@param value [String, Integer]

@return [String]

# File lib/rom/ldap/dataset/dsl.rb, line 292
def escape(value)
  value.to_s.gsub(ESCAPE_REGEX) { |char| '\\' + ESCAPES[char] }
end
join_dsl(operator, ary) click to toggle source

Wrap criteria with a join operator.

@param operator [Symbol] :con_or, :con_and

@param ary [Array] [[op, left, right],[op, left, right]]

# File lib/rom/ldap/dataset/dsl.rb, line 241
def join_dsl(operator, ary)
  ary.size >= 2 ? [operator, ary] : ary.first
end
match_dsl(args, left: EMPTY_STRING, right: EMPTY_STRING) click to toggle source

Wrap criteria value with extra characters, used for wildcard

@param args [Array]

@option :left [String] Prepended to value. @option :right [String] Appended to value.

@return [Array]

@example

match_dsl(bar: 'foo', left: '*', right: '*')
    => [:op_eql, :bar, '*foo*']
# File lib/rom/ldap/dataset/dsl.rb, line 258
def match_dsl(args, left: EMPTY_STRING, right: EMPTY_STRING)
  expressions = args.map do |att, val|
    values = Array(val).map do |v|
      value = left.to_s + escape(v) + right.to_s
      [:op_eql, att, value]
    end

    join_dsl(:con_or, values)
  end
  join_dsl(:con_or, expressions)
end