Module: Fauna::Query

Extended by:
Query
Included in:
Query, QueryDSLContext
Defined in:
lib/fauna/query.rb

Overview

Helpers modeling the FaunaDB Query language.

Helpers are usually used via a concise DSL notation. A DSL block may be used directly with Fauna::Client

client.query { create(ref('classes', 'spells'), { data: { name: 'Magic Missile' } }) }

To build and return an query expression to execute later, use Fauna::Query.expr

Fauna::Query.expr { create(ref('classes', 'spells'), { data: { name: 'Magic Missile' } }) }

Or, you may directly use the helper methods:

Fauna::Query.create(Fauna::Query.ref('classes', 'spells'), { data: { name: 'Magic Missile' } })

Defined Under Namespace

Classes: Expr, QueryDSLContext

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.expr(&block) ⇒ Object

Build a query expression.

Allows for unscoped calls to Fauna::Query methods within the provided block. The block should return the constructed query expression.

Example: Fauna::Query.expr { add(1, 2, subtract(3, 2)) }



32
33
34
35
36
37
38
# File 'lib/fauna/query.rb', line 32

def self.expr(&block)
  return nil if block.nil?

  dsl = QueryDSLContext.new

  Expr.wrap DSLContext.eval_dsl(dsl, &block)
end

Instance Method Details

#add(*numbers) ⇒ Object

An add function

Reference: FaunaDB Miscellaneous Functions



485
486
487
# File 'lib/fauna/query.rb', line 485

def add(*numbers)
  Expr.new add: Expr.wrap_varargs(numbers)
end

#and_(*booleans) ⇒ Object

An and function

Reference: FaunaDB Miscellaneous Functions



557
558
559
# File 'lib/fauna/query.rb', line 557

def and_(*booleans)
  Expr.new and: Expr.wrap_varargs(booleans)
end

#append(collection, elements) ⇒ Object

An append expression

Reference: FaunaDB Collections



232
233
234
# File 'lib/fauna/query.rb', line 232

def append(collection, elements)
  Expr.new append: Expr.wrap(elements), collection: Expr.wrap(collection)
end

#casefold(string) ⇒ Object

A casefold function

Reference: FaunaDB String Functions



417
418
419
# File 'lib/fauna/query.rb', line 417

def casefold(string)
  Expr.new casefold: Expr.wrap(string)
end

#concat(strings, separator = nil) ⇒ Object

A concat function

Reference: FaunaDB String Functions



405
406
407
408
409
410
411
# File 'lib/fauna/query.rb', line 405

def concat(strings, separator = nil)
  if separator.nil?
    Expr.new concat: Expr.wrap(strings)
  else
    Expr.new concat: Expr.wrap(strings), separator: Expr.wrap(separator)
  end
end

#contains(path, in_) ⇒ Object

A contains function

Reference: FaunaDB Miscellaneous Functions



469
470
471
# File 'lib/fauna/query.rb', line 469

def contains(path, in_)
  Expr.new contains: Expr.wrap(path), in: Expr.wrap(in_)
end

#count(set, params = {}) ⇒ Object

A count expression

Reference: FaunaDB Read functions



266
267
268
# File 'lib/fauna/query.rb', line 266

def count(set, params = {})
  Expr.new Expr.wrap_values(params).merge(count: Expr.wrap(set))
end

#create(class_ref, params) ⇒ Object

A create expression

Reference: FaunaDB Write functions



276
277
278
# File 'lib/fauna/query.rb', line 276

def create(class_ref, params)
  Expr.new create: Expr.wrap(class_ref), params: Expr.wrap(params)
end

#date(string) ⇒ Object

A date expression

Reference: FaunaDB Time Functions



443
444
445
# File 'lib/fauna/query.rb', line 443

def date(string)
  Expr.new date: Expr.wrap(string)
end

#delete(ref) ⇒ Object

A delete expression

Reference: FaunaDB Write functions



300
301
302
# File 'lib/fauna/query.rb', line 300

def delete(ref)
  Expr.new delete: Expr.wrap(ref)
end

#difference(*sets) ⇒ Object

A difference expression

Reference: FaunaDB Sets



350
351
352
# File 'lib/fauna/query.rb', line 350

def difference(*sets)
  Expr.new difference: Expr.wrap_varargs(sets)
end

#distinct(set) ⇒ Object

A distinct expression

Reference: FaunaDB Sets



358
359
360
# File 'lib/fauna/query.rb', line 358

def distinct(set)
  Expr.new distinct: Expr.wrap(set)
end

#divide(*numbers) ⇒ Object

A divide function

Reference: FaunaDB Miscellaneous Functions



509
510
511
# File 'lib/fauna/query.rb', line 509

def divide(*numbers)
  Expr.new divide: Expr.wrap_varargs(numbers)
end

#do_(*expressions) ⇒ Object

A do expression

Reference: FaunaDB Basic Forms



117
118
119
# File 'lib/fauna/query.rb', line 117

def do_(*expressions)
  Expr.new do: Expr.wrap_varargs(expressions)
end

#drop(number, collection) ⇒ Object

A drop expression

Reference: FaunaDB Collections



216
217
218
# File 'lib/fauna/query.rb', line 216

def drop(number, collection)
  Expr.new drop: Expr.wrap(number), collection: Expr.wrap(collection)
end

#epoch(number, unit) ⇒ Object

An epoch expression

Reference: FaunaDB Time Functions



435
436
437
# File 'lib/fauna/query.rb', line 435

def epoch(number, unit)
  Expr.new epoch: Expr.wrap(number), unit: Expr.wrap(unit)
end

#equals(*values) ⇒ Object

An equals function

Reference: FaunaDB Miscellaneous Functions



461
462
463
# File 'lib/fauna/query.rb', line 461

def equals(*values)
  Expr.new equals: Expr.wrap_varargs(values)
end

#exists(ref, params = {}) ⇒ Object

An exists expression

Reference: FaunaDB Read functions



258
259
260
# File 'lib/fauna/query.rb', line 258

def exists(ref, params = {})
  Expr.new Expr.wrap_values(params).merge(exists: Expr.wrap(ref))
end

#filter(collection, lambda_expr = nil, &lambda_block) ⇒ Object

A filter expression

Only one of lambda_expr or lambda_block should be provided. For example: Fauna.query { filter(collection) { |a| equals a, 1 } }.

Reference: FaunaDB Collections



200
201
202
# File 'lib/fauna/query.rb', line 200

def filter(collection, lambda_expr = nil, &lambda_block)
  Expr.new filter: Expr.wrap(lambda_expr || lambda_block), collection: Expr.wrap(collection)
end

#foreach(collection, lambda_expr = nil, &lambda_block) ⇒ Object

A foreach expression

Only one of lambda_expr or lambda_block should be provided. For example: Fauna.query { foreach(collection) { |a| delete a } }.

Reference: FaunaDB Collections



189
190
191
# File 'lib/fauna/query.rb', line 189

def foreach(collection, lambda_expr = nil, &lambda_block)
  Expr.new foreach: Expr.wrap(lambda_expr || lambda_block), collection: Expr.wrap(collection)
end

#get(ref, params = {}) ⇒ Object

A get expression

Reference: FaunaDB Read functions



242
243
244
# File 'lib/fauna/query.rb', line 242

def get(ref, params = {})
  Expr.new Expr.wrap_values(params).merge(get: Expr.wrap(ref))
end

#gt(*values) ⇒ Object

A greater than function

Reference: FaunaDB Miscellaneous Functions



541
542
543
# File 'lib/fauna/query.rb', line 541

def gt(*values)
  Expr.new gt: Expr.wrap_varargs(values)
end

#gte(*values) ⇒ Object

A greater than or equal function

Reference: FaunaDB Miscellaneous Functions



549
550
551
# File 'lib/fauna/query.rb', line 549

def gte(*values)
  Expr.new gte: Expr.wrap_varargs(values)
end

#identify(ref, password) ⇒ Object

An identify function

Reference: FaunaDB Authentication



395
396
397
# File 'lib/fauna/query.rb', line 395

def identify(ref, password)
  Expr.new identify: Expr.wrap(ref), password: Expr.wrap(password)
end

#if_(condition, then_, else_) ⇒ Object

An if expression

Reference: FaunaDB Basic Forms



109
110
111
# File 'lib/fauna/query.rb', line 109

def if_(condition, then_, else_)
  Expr.new if: Expr.wrap(condition), then: Expr.wrap(then_), else: Expr.wrap(else_)
end

#insert(ref, ts, action, params) ⇒ Object

An insert expression

Reference: FaunaDB Write functions



308
309
310
# File 'lib/fauna/query.rb', line 308

def insert(ref, ts, action, params)
  Expr.new insert: Expr.wrap(ref), ts: Expr.wrap(ts), action: Expr.wrap(action), params: Expr.wrap(params)
end

#intersection(*sets) ⇒ Object

An intersection expression

Reference: FaunaDB Sets



342
343
344
# File 'lib/fauna/query.rb', line 342

def intersection(*sets)
  Expr.new intersection: Expr.wrap_varargs(sets)
end

#join(source, target_expr = nil, &target_block) ⇒ Object

A join expression

Only one of target_expr or target_block should be provided. For example: Fauna.query { join(source) { |x| match some_index, x } }.

Reference: FaunaDB Sets



369
370
371
# File 'lib/fauna/query.rb', line 369

def join(source, target_expr = nil, &target_block)
  Expr.new join: Expr.wrap(source), with: Expr.wrap(target_expr || target_block)
end

#lambda(&block) ⇒ Object

A lambda expression

Reference: FaunaDB Basic Forms

This form generates #var objects for you, and is called like:

Query.lambda do |a|
  Query.add a, a
end
# Produces: {lambda: :a, expr: {add: [{var: :a}, {var: :a}]}}

Query functions requiring lambdas can be passed blocks without explicitly calling #lambda.

You can also use #lambda_expr and #var directly.

block

Takes one or more #var expressions and uses them to construct an expression. If this takes more than one argument, the lambda destructures an array argument. (To destructure single-element arrays use #lambda_expr.)



140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
# File 'lib/fauna/query.rb', line 140

def lambda(&block)
  dsl = Query::QueryDSLContext.new
  vars =
    block.parameters.map do |kind, name|
      fail ArgumentError, 'Splat parameters are not supported in lambda expressions.' if kind == :rest
      name
    end

  case vars.length
  when 0
    fail ArgumentError, 'Block must take at least 1 argument.'
  when 1
    # When there's only 1 parameter, don't use an array pattern.
    lambda_expr vars[0], DSLContext.eval_dsl(dsl, var(vars[0]), &block)
  else
    lambda_expr vars, DSLContext.eval_dsl(dsl, *(vars.map { |v| var(v) }), &block)
  end
end

#lambda_expr(var, expr) ⇒ Object

A raw lambda expression

Reference: FaunaDB Basic Forms

See also #lambda.



165
166
167
# File 'lib/fauna/query.rb', line 165

def lambda_expr(var, expr)
  Expr.new lambda: Expr.wrap(var), expr: Expr.wrap(expr)
end

#let(vars, expr = nil, &block) ⇒ Object

A let expression

Only one of expr or block should be provided.

Block example: Fauna.query { let(x: 2) { add(1, x) } }.

Expression example: Fauna.query { let({ x: 2 }, add(1, var(:x))) }.

Reference: FaunaDB Basic Forms



79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# File 'lib/fauna/query.rb', line 79

def let(vars, expr = nil, &block)
  in_ =
    if block.nil?
      expr
    else
      dsl = QueryDSLContext.new
      dslcls = (class << dsl; self; end)

      vars.keys.each do |v|
        dslcls.send(:define_method, v) { var(v) }
      end

      DSLContext.eval_dsl(dsl, &block)
    end

  Expr.new let: Expr.wrap_values(vars), in: Expr.wrap(in_)
end

#login(ref, params) ⇒ Object

A login function

Reference: FaunaDB Authentication



379
380
381
# File 'lib/fauna/query.rb', line 379

def (ref, params)
  Expr.new login: Expr.wrap(ref), params: Expr.wrap(params)
end

#logout(all_tokens) ⇒ Object

A logout function

Reference: FaunaDB Authentication



387
388
389
# File 'lib/fauna/query.rb', line 387

def logout(all_tokens)
  Expr.new logout: Expr.wrap(all_tokens)
end

#lt(*values) ⇒ Object

A less than function

Reference: FaunaDB Miscellaneous Functions



525
526
527
# File 'lib/fauna/query.rb', line 525

def lt(*values)
  Expr.new lt: Expr.wrap_varargs(values)
end

#lte(*values) ⇒ Object

A less than or equal function

Reference: FaunaDB Miscellaneous Functions



533
534
535
# File 'lib/fauna/query.rb', line 533

def lte(*values)
  Expr.new lte: Expr.wrap_varargs(values)
end

#map(collection, lambda_expr = nil, &lambda_block) ⇒ Object

A map expression

Only one of lambda_expr or lambda_block should be provided. For example: Fauna.query { map(collection) { |a| add a, 1 } }.

Reference: FaunaDB Collections



178
179
180
# File 'lib/fauna/query.rb', line 178

def map(collection, lambda_expr = nil, &lambda_block)
  Expr.new map: Expr.wrap(lambda_expr || lambda_block), collection: Expr.wrap(collection)
end

#match(index, *terms) ⇒ Object

A match expression

Reference: FaunaDB Sets



326
327
328
# File 'lib/fauna/query.rb', line 326

def match(index, *terms)
  Expr.new match: Expr.wrap(index), terms: Expr.wrap_varargs(terms)
end

#modulo(*numbers) ⇒ Object

A modulo function

Reference: FaunaDB Miscellaneous Functions



517
518
519
# File 'lib/fauna/query.rb', line 517

def modulo(*numbers)
  Expr.new modulo: Expr.wrap_varargs(numbers)
end

#multiply(*numbers) ⇒ Object

A multiply function

Reference: FaunaDB Miscellaneous Functions



493
494
495
# File 'lib/fauna/query.rb', line 493

def multiply(*numbers)
  Expr.new multiply: Expr.wrap_varargs(numbers)
end

#next_idObject

A next_id function

Reference: FaunaDB Miscellaneous Functions



453
454
455
# File 'lib/fauna/query.rb', line 453

def next_id
  Expr.new next_id: nil
end

#not_(boolean) ⇒ Object

A not function

Reference: FaunaDB Miscellaneous Functions



573
574
575
# File 'lib/fauna/query.rb', line 573

def not_(boolean)
  Expr.new not: Expr.wrap(boolean)
end

#object(fields) ⇒ Object

An object expression

Query expression constructs can also take a regular ruby object, so the following are equivalent:

Fauna.query { { x: 1, y: add(1, 2) } }
Fauna.query { object(x: 1, y: add(1, 2)) }

Reference: FaunaDB Basic Forms



63
64
65
# File 'lib/fauna/query.rb', line 63

def object(fields)
  Expr.new object: Expr.wrap_values(fields)
end

#or_(*booleans) ⇒ Object

An or function

Reference: FaunaDB Miscellaneous Functions



565
566
567
# File 'lib/fauna/query.rb', line 565

def or_(*booleans)
  Expr.new or: Expr.wrap_varargs(booleans)
end

#paginate(set, params = {}) ⇒ Object

A paginate expression

Reference: FaunaDB Read functions



250
251
252
# File 'lib/fauna/query.rb', line 250

def paginate(set, params = {})
  Expr.new Expr.wrap_values(params).merge(paginate: Expr.wrap(set))
end

#prepend(collection, elements) ⇒ Object

A prepend expression

Reference: FaunaDB Collections



224
225
226
# File 'lib/fauna/query.rb', line 224

def prepend(collection, elements)
  Expr.new prepend: Expr.wrap(elements), collection: Expr.wrap(collection)
end

#ref(str, id = nil) ⇒ Object

Construct a ref value

Reference: FaunaDB Values



46
47
48
49
50
51
52
# File 'lib/fauna/query.rb', line 46

def ref(str, id = nil)
  if id.nil?
    Ref.new(str)
  else
    Expr.new ref: Expr.wrap(str), id: Expr.wrap(id)
  end
end

#remove(ref, ts, action) ⇒ Object

A remove expression

Reference: FaunaDB Write functions



316
317
318
# File 'lib/fauna/query.rb', line 316

def remove(ref, ts, action)
  Expr.new remove: Expr.wrap(ref), ts: Expr.wrap(ts), action: Expr.wrap(action)
end

#replace(ref, params) ⇒ Object

A replace expression

Reference: FaunaDB Write functions



292
293
294
# File 'lib/fauna/query.rb', line 292

def replace(ref, params)
  Expr.new replace: Expr.wrap(ref), params: Expr.wrap(params)
end

#select(path, from, params = {}) ⇒ Object

A select function

Reference: FaunaDB Miscellaneous Functions



477
478
479
# File 'lib/fauna/query.rb', line 477

def select(path, from, params = {})
  Expr.new Expr.wrap_values(params).merge(select: Expr.wrap(path), from: Expr.wrap(from))
end

#subtract(*numbers) ⇒ Object

A subtract function

Reference: FaunaDB Miscellaneous Functions



501
502
503
# File 'lib/fauna/query.rb', line 501

def subtract(*numbers)
  Expr.new subtract: Expr.wrap_varargs(numbers)
end

#take(number, collection) ⇒ Object

A take expression

Reference: FaunaDB Collections



208
209
210
# File 'lib/fauna/query.rb', line 208

def take(number, collection)
  Expr.new take: Expr.wrap(number), collection: Expr.wrap(collection)
end

#time(string) ⇒ Object

A time expression

Reference: FaunaDB Time Functions



427
428
429
# File 'lib/fauna/query.rb', line 427

def time(string)
  Expr.new time: Expr.wrap(string)
end

#union(*sets) ⇒ Object

A union expression

Reference: FaunaDB Sets



334
335
336
# File 'lib/fauna/query.rb', line 334

def union(*sets)
  Expr.new union: Expr.wrap_varargs(sets)
end

#update(ref, params) ⇒ Object

An update expression

Reference: FaunaDB Write functions



284
285
286
# File 'lib/fauna/query.rb', line 284

def update(ref, params)
  Expr.new update: Expr.wrap(ref), params: Expr.wrap(params)
end

#var(name) ⇒ Object

A var expression

Reference: FaunaDB Basic Forms



101
102
103
# File 'lib/fauna/query.rb', line 101

def var(name)
  Expr.new var: Expr.wrap(name)
end