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



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

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

#and_(*booleans) ⇒ Object

An and function

Reference: FaunaDB Miscellaneous Functions



621
622
623
# File 'lib/fauna/query.rb', line 621

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

#append(collection, elements) ⇒ Object

An append expression

Reference: FaunaDB Collections



240
241
242
# File 'lib/fauna/query.rb', line 240

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

#at(timestamp, expr) ⇒ Object

An at expression

Reference: FaunaDB Basic Forms



73
74
75
# File 'lib/fauna/query.rb', line 73

def at(timestamp, expr)
  Expr.new at: Expr.wrap(timestamp), expr: Expr.wrap(expr)
end

#casefold(string) ⇒ Object

A casefold function

Reference: FaunaDB String Functions



457
458
459
# File 'lib/fauna/query.rb', line 457

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

#class_(name) ⇒ Object

A class function

Reference: FaunaDB Miscellaneous Functions



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

def class_(name)
  Expr.new class: Expr.wrap(name)
end

#concat(strings, separator = nil) ⇒ Object

A concat function

Reference: FaunaDB String Functions



445
446
447
448
449
450
451
# File 'lib/fauna/query.rb', line 445

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



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

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

#create(class_ref, params) ⇒ Object

A create expression

Reference: FaunaDB Write functions



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

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

#create_class(params) ⇒ Object

A create class expression

Reference: FaunaDB Write functions



332
333
334
# File 'lib/fauna/query.rb', line 332

def create_class(params)
  Expr.new create_class: Expr.wrap(params)
end

#create_database(params) ⇒ Object

A create database expression

Reference: FaunaDB Write functions



348
349
350
# File 'lib/fauna/query.rb', line 348

def create_database(params)
  Expr.new create_database: Expr.wrap(params)
end

#create_index(params) ⇒ Object

A create index expression

Reference: FaunaDB Write functions



340
341
342
# File 'lib/fauna/query.rb', line 340

def create_index(params)
  Expr.new create_index: Expr.wrap(params)
end

#create_key(params) ⇒ Object

A create key expression

Reference: FaunaDB Write functions



356
357
358
# File 'lib/fauna/query.rb', line 356

def create_key(params)
  Expr.new create_key: Expr.wrap(params)
end

#database(name) ⇒ Object

A database function

Reference: FaunaDB Miscellaneous Functions



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

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

#date(string) ⇒ Object

A date expression

Reference: FaunaDB Time Functions



483
484
485
# File 'lib/fauna/query.rb', line 483

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

#delete(ref) ⇒ Object

A delete expression

Reference: FaunaDB Write functions



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

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

#difference(*sets) ⇒ Object

A difference expression

Reference: FaunaDB Sets



390
391
392
# File 'lib/fauna/query.rb', line 390

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

#distinct(set) ⇒ Object

A distinct expression

Reference: FaunaDB Sets



398
399
400
# File 'lib/fauna/query.rb', line 398

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

#divide(*numbers) ⇒ Object

A divide function

Reference: FaunaDB Miscellaneous Functions



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

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

#do_(*expressions) ⇒ Object

A do expression

Reference: FaunaDB Basic Forms



125
126
127
# File 'lib/fauna/query.rb', line 125

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

#drop(number, collection) ⇒ Object

A drop expression

Reference: FaunaDB Collections



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

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



475
476
477
# File 'lib/fauna/query.rb', line 475

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



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

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

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

An exists expression

Reference: FaunaDB Read functions



274
275
276
# File 'lib/fauna/query.rb', line 274

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



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

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



197
198
199
# File 'lib/fauna/query.rb', line 197

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



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

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



605
606
607
# File 'lib/fauna/query.rb', line 605

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

#gte(*values) ⇒ Object

A greater than or equal function

Reference: FaunaDB Miscellaneous Functions



613
614
615
# File 'lib/fauna/query.rb', line 613

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

#identify(ref, password) ⇒ Object

An identify function

Reference: FaunaDB Authentication



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

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



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

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

#index(name) ⇒ Object

An index function

Reference: FaunaDB Miscellaneous Functions



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

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

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

An insert expression

Reference: FaunaDB Write functions



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

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



382
383
384
# File 'lib/fauna/query.rb', line 382

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



409
410
411
# File 'lib/fauna/query.rb', line 409

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

#key_from_secret(secret) ⇒ Object

A key_from_secret expression

Reference: FaunaDB Read functions



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

def key_from_secret(secret)
  Expr.new key_from_secret: Expr.wrap(secret)
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.)



148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
# File 'lib/fauna/query.rb', line 148

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.



173
174
175
# File 'lib/fauna/query.rb', line 173

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



87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
# File 'lib/fauna/query.rb', line 87

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



419
420
421
# File 'lib/fauna/query.rb', line 419

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

#logout(all_tokens) ⇒ Object

A logout function

Reference: FaunaDB Authentication



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

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

#lt(*values) ⇒ Object

A less than function

Reference: FaunaDB Miscellaneous Functions



589
590
591
# File 'lib/fauna/query.rb', line 589

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

#lte(*values) ⇒ Object

A less than or equal function

Reference: FaunaDB Miscellaneous Functions



597
598
599
# File 'lib/fauna/query.rb', line 597

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



186
187
188
# File 'lib/fauna/query.rb', line 186

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



366
367
368
# File 'lib/fauna/query.rb', line 366

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



581
582
583
# File 'lib/fauna/query.rb', line 581

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

#multiply(*numbers) ⇒ Object

A multiply function

Reference: FaunaDB Miscellaneous Functions



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

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

#next_idObject

A next_id function

Reference: FaunaDB Miscellaneous Functions



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

def next_id
  Expr.new next_id: nil
end

#not_(boolean) ⇒ Object

A not function

Reference: FaunaDB Miscellaneous Functions



637
638
639
# File 'lib/fauna/query.rb', line 637

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



629
630
631
# File 'lib/fauna/query.rb', line 629

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

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

A paginate expression

Reference: FaunaDB Read functions



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

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



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

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



324
325
326
# File 'lib/fauna/query.rb', line 324

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



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

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



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

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



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

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

#take(number, collection) ⇒ Object

A take expression

Reference: FaunaDB Collections



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

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



467
468
469
# File 'lib/fauna/query.rb', line 467

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

#union(*sets) ⇒ Object

A union expression

Reference: FaunaDB Sets



374
375
376
# File 'lib/fauna/query.rb', line 374

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

#update(ref, params) ⇒ Object

An update expression

Reference: FaunaDB Write functions



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

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



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

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