Skip to content

Commit 53ecbd4

Browse files
committed
add write hook and bitwise operators
1 parent 00fed5b commit 53ecbd4

File tree

6 files changed

+110
-8
lines changed

6 files changed

+110
-8
lines changed

private/ql2.nim

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ type
7272
GET_FIELD = 31
7373
HAS_FIELDS = 32
7474
PLUCK = 33
75-
WITHOUT_R = 34
75+
WITHOUT = 34
7676
MERGE = 35
7777
BETWEEN_DEPRECATED = 36
7878
REDUCE = 37
@@ -220,3 +220,14 @@ type
220220
FLOOR = 183
221221
CEIL = 184
222222
ROUND = 185
223+
VALUES = 186
224+
FOLD = 187
225+
GRANT = 188
226+
SET_WRITE_HOOK = 189
227+
GET_WRITE_HOOK = 190
228+
BIT_AND = 191
229+
BIT_OR = 192
230+
BIT_XOR = 193
231+
BIT_NOT = 194
232+
BIT_SAL = 195
233+
BIT_SAR = 196

private/queries/document.nim

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ proc pluck*[T](r: T, n: varargs[string]): RqlQuery =
77
for x in n:
88
result.addArg(x)
99

10-
proc withoutR*[T](r: T, n: varargs[string]): RqlQuery =
11-
NEW_QUERY(WITHOUT_R, r)
10+
proc without*[T](r: T, n: varargs[string]): RqlQuery =
11+
NEW_QUERY(WITHOUT, r)
1212
for x in n:
1313
result.addArg(x)
1414

@@ -22,6 +22,12 @@ proc merge*[T, U](r: T, n: varargs[proc(x: RqlQuery): U]): RqlQuery =
2222
for f in n:
2323
result.addArg(funcWrap(f))
2424

25+
proc merge*[T](r: T, n: openArray[(string, RqlQuery)]): RqlQuery =
26+
NEW_QUERY(MERGE, r)
27+
for x in n:
28+
result.addArg(&*{x[0]: x[1]})
29+
30+
2531
proc append*[T](r: RqlQuery, t: T): RqlQuery =
2632
NEW_QUERY(APPEND, r, t)
2733

private/queries/math.nim

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,3 +118,37 @@ proc random*(r: RethinkClient, x = 0, y = 1, isFloat = false): RqlQuery =
118118
result.addArg(newDatum(y))
119119
if isFloat:
120120
result.setOption("float", isFloat)
121+
122+
proc bitAnd*(r: RqlQuery, numbers: varargs[int]): RqlQuery =
123+
## bitwise AND
124+
NEW_QUERY(BIT_AND, r)
125+
for n in numbers:
126+
result.addArg(n)
127+
128+
proc bitNot*(r: RqlQuery): RqlQuery =
129+
## bitwise NOT
130+
NEW_QUERY(BIT_NOT, r)
131+
132+
proc bitOr*(r: RqlQuery, numbers: varargs[int]): RqlQuery =
133+
## bitwise OR
134+
NEW_QUERY(BIT_Or, r)
135+
for n in numbers:
136+
result.addArg(n)
137+
138+
proc bitShl*(r: RqlQuery, numbers: varargs[int]): RqlQuery =
139+
## bitwise SHL
140+
NEW_QUERY(BIT_SAL, r)
141+
for n in numbers:
142+
result.addArg(n)
143+
144+
proc bitShr*(r: RqlQuery, numbers: varargs[int]): RqlQuery =
145+
## bitwise SHR
146+
NEW_QUERY(BIT_SAR, r)
147+
for n in numbers:
148+
result.addArg(n)
149+
150+
proc bitXor*(r: RqlQuery, numbers: varargs[int]): RqlQuery =
151+
## bitwise XOR
152+
NEW_QUERY(BIT_XOR, r)
153+
for n in numbers:
154+
result.addArg(n)

private/queries/table.nim

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,3 +72,17 @@ proc changes*[T](r: T, squash = false, includeStates = false): RqlQuery =
7272
result.setOption("squash", squash)
7373
if includeStates:
7474
result.setOption("include_states", includeStates)
75+
76+
proc setWriteHook*(r: RqlQuery): RqlQuery =
77+
## Sets the write hook on a table or overwrites it if one already exists
78+
NEW_QUERY(SET_WRITE_HOOK, r)
79+
result.addArg(DEFAULT)
80+
81+
proc setWriteHook*[U](r: RqlQuery, f: proc(ctx, oldValue, newValue: RqlQuery): U): RqlQuery =
82+
## Sets the write hook on a table or overwrites it if one already exists
83+
NEW_QUERY(SET_WRITE_HOOK, r)
84+
result.addArg(funcWrap(f))
85+
86+
proc getWriteHook*(r: RqlQuery): RqlQuery =
87+
## Gets the write hook of a table, if any
88+
NEW_QUERY(GET_WRITE_HOOK, r)

private/rql.nim

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11

22
## This module provides all high-level API for query and manipulate data
3-
import json, future
3+
import json, sugar
44
import ql2, datum, connection, utils, types
55

66

@@ -245,6 +245,24 @@ proc makeFunc*[T](f: T): RqlQuery =
245245
result.addArg(&[varId])
246246
result.addArg(f)
247247

248+
proc funcWrap*[T](f: proc(ctx, oldValue, newValue: RqlQuery): T): RqlQuery =
249+
NEW_QUERY(FUNC)
250+
251+
let
252+
v1 = makeVar(1)
253+
v2 = makeVar(2)
254+
v3 = makeVar(3)
255+
256+
result.addArg(&*[1, 2, 3])
257+
let res = f(v1, v2, v3)
258+
when res is array:
259+
var arr = newQuery(MAKE_ARRAY)
260+
for x in res:
261+
arr.addArg(x)
262+
result.addArg(arr)
263+
else:
264+
result.addArg(res)
265+
248266
proc `[]`*(r: RqlQuery, s: auto): RqlQuery =
249267
## Operator for create row's fields chain
250268
##

tests/test_math_logic.nim

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import unittest, json
22
import ../rethinkdb
33

4-
let r = R.connect().repl()
5-
64
suite "math and logic tests":
5+
let r = R.connect().repl()
6+
var ret: JsonNode
7+
78
test "add":
89
let output = 2
9-
var ret: JsonNode
1010
ret = (r.expr(1) + 1).run()
1111
check(ret.num == output)
1212
ret = (1 + r.expr(1)).run()
@@ -35,4 +35,23 @@ suite "math and logic tests":
3535
expect(RqlRuntimeError):
3636
discard (r.expr("a") + 1).run()
3737

38-
r.close()
38+
test "bit wises":
39+
ret = r.expr(5).bitAnd(3).run()
40+
check(ret.getInt == 1)
41+
42+
ret = r.expr(7).bitNot().run()
43+
check(ret.getInt == -8)
44+
45+
ret = r.expr(5).bitOr(3).run()
46+
check(ret.getInt == 7)
47+
48+
ret = r.expr(5).bitShl(4).run()
49+
check(ret.getInt == 80)
50+
51+
ret = r.expr(32).bitShr(3).run()
52+
check(ret.getInt == 4)
53+
54+
ret = r.expr(6).bitXor(4).run()
55+
check(ret.getInt == 2)
56+
57+
r.close()

0 commit comments

Comments
 (0)