rethinkdb 1.2.6.1 → 1.4.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/exc.rb +30 -0
- data/lib/func.rb +156 -0
- data/lib/net.rb +137 -177
- data/lib/ql2.pb.rb +615 -0
- data/lib/rethinkdb.rb +70 -9
- data/lib/rpp.rb +191 -0
- data/lib/shim.rb +101 -0
- metadata +13 -21
- data/lib/base_classes.rb +0 -39
- data/lib/bt.rb +0 -148
- data/lib/data_collectors.rb +0 -35
- data/lib/jsons.rb +0 -140
- data/lib/protob_compiler.rb +0 -137
- data/lib/query.rb +0 -111
- data/lib/query_language.pb.rb +0 -687
- data/lib/rql.rb +0 -472
- data/lib/sequence.rb +0 -350
- data/lib/streams.rb +0 -101
- data/lib/tables.rb +0 -123
- data/lib/utils.rb +0 -118
- data/lib/writes.rb +0 -24
data/lib/bt.rb
DELETED
@@ -1,148 +0,0 @@
|
|
1
|
-
# Copyright 2010-2012 RethinkDB, all rights reserved.
|
2
|
-
module RethinkDB
|
3
|
-
module BT_Mixin
|
4
|
-
attr_accessor :highlight, :line
|
5
|
-
|
6
|
-
def sanitize_context(context)
|
7
|
-
if __FILE__ =~ /^(.*\/)[^\/]+.rb$/
|
8
|
-
prefix = $1;
|
9
|
-
context.reject{|x| x =~ /^#{prefix}/}
|
10
|
-
else
|
11
|
-
context
|
12
|
-
end
|
13
|
-
end
|
14
|
-
|
15
|
-
def format_highlights(str)
|
16
|
-
str.chars.map{|x| x == "\000" ? "^" : " "}.join.rstrip
|
17
|
-
end
|
18
|
-
|
19
|
-
def force_raise(query, debug=false)
|
20
|
-
obj = query.run
|
21
|
-
#maybe_reformat_err(query, obj);
|
22
|
-
PP.pp obj if debug
|
23
|
-
if obj.class == Query_Results
|
24
|
-
obj = obj.to_a
|
25
|
-
elsif obj.class == Hash
|
26
|
-
raise RuntimeError,obj['first_error'] if obj['first_error']
|
27
|
-
end
|
28
|
-
obj
|
29
|
-
end
|
30
|
-
|
31
|
-
def maybe_reformat_err(query, obj)
|
32
|
-
if obj.class == Hash && (err = obj['first_error'])
|
33
|
-
obj['first_error'] = format_err(query, err)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
def format_err(query, err)
|
38
|
-
parts = err.split("\nBacktrace:\n")
|
39
|
-
errline = parts[0] || ""
|
40
|
-
bt = (parts[1] && parts[1].split("\n")) || []
|
41
|
-
errline+"\n"+query.print_backtrace(bt)
|
42
|
-
end
|
43
|
-
|
44
|
-
def set(sym,val)
|
45
|
-
@map = {} if not @map
|
46
|
-
res, @map[sym] = @map[sym], val
|
47
|
-
return res
|
48
|
-
end
|
49
|
-
def consume sym
|
50
|
-
@map = {} if not @map
|
51
|
-
res, @map[sym] = @map[sym], nil
|
52
|
-
return res.nil? ? 0 : res
|
53
|
-
end
|
54
|
-
def expand arg
|
55
|
-
case arg
|
56
|
-
when 'attr' then []
|
57
|
-
when 'attrname' then []
|
58
|
-
when 'base' then [1+consume(:reduce)]
|
59
|
-
when 'body' then [4+consume(:reduce)]
|
60
|
-
when 'datacenter' then []
|
61
|
-
when 'db_name' then []
|
62
|
-
when 'expr' then [2]
|
63
|
-
when 'false' then [3]
|
64
|
-
when 'group_mapping' then [1, 1, 1]
|
65
|
-
when 'key' then [3]
|
66
|
-
when 'keyname' then []
|
67
|
-
when 'lowerbound' then [1, 2]
|
68
|
-
when 'mapping' then [1, 2]
|
69
|
-
when 'modify_map' then [2, 1]
|
70
|
-
when 'order_by' then []
|
71
|
-
when 'point_map' then [4, 1]
|
72
|
-
when 'predicate' then [1, 2]
|
73
|
-
when 'reduce' then [1]
|
74
|
-
when 'reduction' then set(:reduce, -1); [1, 3]
|
75
|
-
when 'stream' then [1]
|
76
|
-
when 'table_name' then []
|
77
|
-
when 'table_ref' then []
|
78
|
-
when 'test' then [1]
|
79
|
-
when 'true' then [2]
|
80
|
-
when 'upperbound' then [1, 3]
|
81
|
-
when 'value_mapping' then [1, 2, 1]
|
82
|
-
when 'view' then [1]
|
83
|
-
when /arg:([0-9]+)/ then [2, $1.to_i]
|
84
|
-
when /attrs:([0-9]+)/ then []
|
85
|
-
when /elem:([0-9]+)/ then [$1.to_i+1]
|
86
|
-
when /bind:(.+)$/ then [1, $1]
|
87
|
-
when /key:(.+)$/ then [1..-1, $1]
|
88
|
-
when /query:([0-9]+)/ then [3, $1.to_i]
|
89
|
-
when /term:([0-9]+)/ then [2, $1.to_i]
|
90
|
-
else [:error]
|
91
|
-
end
|
92
|
-
end
|
93
|
-
|
94
|
-
def recur(arr, lst, val)
|
95
|
-
if lst[0].class == String
|
96
|
-
entry = arr[0..-1].find{|x| x[0].to_s == lst[0]}
|
97
|
-
raise RuntimeError if not entry
|
98
|
-
mark(entry[1], lst[1..-1], val)
|
99
|
-
elsif lst[0].class == Fixnum || lst[0].class == Range
|
100
|
-
mark(arr[lst[0]], lst[1..-1], val) if lst != []
|
101
|
-
else
|
102
|
-
raise RuntimeError
|
103
|
-
end
|
104
|
-
end
|
105
|
-
def mark(query, lst, val)
|
106
|
-
#PP.pp [lst, query.class, query]
|
107
|
-
if query.class == Array
|
108
|
-
recur(query, lst, val) if lst != []
|
109
|
-
elsif query.kind_of? RQL_Query
|
110
|
-
if lst == []
|
111
|
-
@line = sanitize_context(query.context)[0]
|
112
|
-
val,query.marked = query.marked, val
|
113
|
-
val
|
114
|
-
else
|
115
|
-
recur(query.body, lst, val)
|
116
|
-
end
|
117
|
-
else raise RuntimeError
|
118
|
-
end
|
119
|
-
end
|
120
|
-
|
121
|
-
def with_marked_error(query, bt)
|
122
|
-
@map = {}
|
123
|
-
bt = bt.map{|x| expand x}.flatten
|
124
|
-
raise RuntimeError if bt.any?{|x| x == :error}
|
125
|
-
old = mark(query, bt, :error)
|
126
|
-
res = yield
|
127
|
-
mark(query, bt, old)
|
128
|
-
return res
|
129
|
-
end
|
130
|
-
|
131
|
-
def with_highlight
|
132
|
-
@highlight = true
|
133
|
-
str = yield
|
134
|
-
@highlight = false
|
135
|
-
str.chars.map{|x| x == "\000" ? "^" : " "}.join.rstrip
|
136
|
-
end
|
137
|
-
|
138
|
-
def alt_inspect(query, &block)
|
139
|
-
class << query
|
140
|
-
attr_accessor :str_block
|
141
|
-
def inspect; real_inspect({:str => @str_block.call(self)}); end
|
142
|
-
end
|
143
|
-
query.str_block = block
|
144
|
-
query
|
145
|
-
end
|
146
|
-
end
|
147
|
-
module BT; extend BT_Mixin; end
|
148
|
-
end
|
data/lib/data_collectors.rb
DELETED
@@ -1,35 +0,0 @@
|
|
1
|
-
# Copyright 2010-2012 RethinkDB, all rights reserved.
|
2
|
-
module RethinkDB
|
3
|
-
# Data collectors are ways of aggregating data (for use with
|
4
|
-
# Sequence#groupby). You can define your own; all they are is a hash
|
5
|
-
# containing a <b>+mapping+</b> to be applied to row, a
|
6
|
-
# <b>+base+</b>/<b>+reduction+</b> to reduce over the mappings, and an
|
7
|
-
# optional <b>+finalizer+</b> to call on the output of the reduction. You can
|
8
|
-
# expand the builtin data collectors below for examples.
|
9
|
-
#
|
10
|
-
# All of the builtin collectors can also be accessed using the <b>+r+</b>
|
11
|
-
# shortcut (like <b>+r.sum+</b>).
|
12
|
-
module Data_Collectors
|
13
|
-
# Count the number of rows in each group.
|
14
|
-
def self.count
|
15
|
-
{ :mapping => lambda{|row| 1},
|
16
|
-
:base => 0,
|
17
|
-
:reduction => lambda{|acc, val| acc + val} }
|
18
|
-
end
|
19
|
-
|
20
|
-
# Sum a particular attribute of the rows in each group.
|
21
|
-
def self.sum(attr)
|
22
|
-
{ :mapping => lambda{|row| row[attr]},
|
23
|
-
:base => 0,
|
24
|
-
:reduction => lambda{|acc, val| acc + val} }
|
25
|
-
end
|
26
|
-
|
27
|
-
# Average a particular attribute of the rows in each group.
|
28
|
-
def self.avg(attr)
|
29
|
-
{ :mapping => lambda{|row| [row[attr], 1]},
|
30
|
-
:base => [0, 0],
|
31
|
-
:reduction => lambda{|acc, val| [acc[0] + val[0], acc[1] + val[1]]},
|
32
|
-
:finalizer => lambda{|res| res[0] / res[1]} }
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
data/lib/jsons.rb
DELETED
@@ -1,140 +0,0 @@
|
|
1
|
-
# Copyright 2010-2012 RethinkDB, all rights reserved.
|
2
|
-
module RethinkDB
|
3
|
-
# A query returning a JSON expression. Most of the functions that you
|
4
|
-
# can run on a JSON object are found in RethinkDB::RQL and accessed
|
5
|
-
# with the <b>+r+</b> shortcut. For convenience, may of the
|
6
|
-
# functions in Rethinkdb::RQL can be run as if they were instance
|
7
|
-
# methods of JSON_Expression. For example, the following are
|
8
|
-
# equivalent:
|
9
|
-
# r.add(1, 2)
|
10
|
-
# r(1).add(2)
|
11
|
-
# r(3)
|
12
|
-
#
|
13
|
-
# Running a JSON_Expression query will return a literal Ruby
|
14
|
-
# representation of the resulting JSON, rather than a stream or a
|
15
|
-
# string. For example, the following are equivalent:
|
16
|
-
# r.add(1,2).run
|
17
|
-
# 3
|
18
|
-
# As are:
|
19
|
-
# r({:a => 1, :b => 2}).pick(:a).run
|
20
|
-
# {'a' => 1}
|
21
|
-
# (Note that the symbol keys were coerced into string keys in the
|
22
|
-
# object. JSON doesn't distinguish between symbols and strings.)
|
23
|
-
class JSON_Expression
|
24
|
-
# If <b>+ind+</b> is a symbol or a string, gets the corresponding
|
25
|
-
# attribute of an object. For example, the following are equivalent:
|
26
|
-
# r({:id => 1})[:id]
|
27
|
-
# r({:id => 1})['id']
|
28
|
-
# r(1)
|
29
|
-
# Otherwise, if <b>+ind+</b> is a number or a range, invokes RethinkDB::Sequence#[]
|
30
|
-
def [](ind)
|
31
|
-
if ind.class == Symbol || ind.class == String
|
32
|
-
BT.alt_inspect(JSON_Expression.new [:call, [:getattr, ind], [self]]) {
|
33
|
-
"#{self.inspect}[#{ind.inspect}]"
|
34
|
-
}
|
35
|
-
else
|
36
|
-
super
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
# Append a single element to an array. The following are equivalent:
|
41
|
-
# r([1,2,3,4])
|
42
|
-
# r([1,2,3]).append(4)
|
43
|
-
def append(el)
|
44
|
-
JSON_Expression.new [:call, [:arrayappend], [self, S.r(el)]]
|
45
|
-
end
|
46
|
-
|
47
|
-
# Get an attribute of a JSON object (the same as
|
48
|
-
# JSON_Expression#[]). The following are equivalent.
|
49
|
-
# r({:id => 1}).getattr(:id)
|
50
|
-
# r({:id => 1})[:id]
|
51
|
-
# r(1)
|
52
|
-
def getattr(attrname)
|
53
|
-
JSON_Expression.new [:call, [:getattr, attrname], [self]]
|
54
|
-
end
|
55
|
-
|
56
|
-
# Check whether a JSON object has all of the particular attributes. The
|
57
|
-
# following are equivalent:
|
58
|
-
# r({:id => 1, :val => 2}).contains(:id, :val)
|
59
|
-
# r(true)
|
60
|
-
def contains(*attrnames)
|
61
|
-
if attrnames.length == 1
|
62
|
-
JSON_Expression.new [:call, [:contains, attrnames[0]], [self]]
|
63
|
-
else
|
64
|
-
self.contains(attrnames[0]) & self.contains(*attrnames[1..-1])
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
# Construct a JSON object that has a subset of the attributes of
|
69
|
-
# another JSON object by specifying which to keep. The following are equivalent:
|
70
|
-
# r({:a => 1, :b => 2, :c => 3}).pick(:a, :c)
|
71
|
-
# r({:a => 1, :c => 3})
|
72
|
-
def pick(*attrnames)
|
73
|
-
JSON_Expression.new [:call, [:pick, *attrnames], [self]]
|
74
|
-
end
|
75
|
-
|
76
|
-
# Construct a JSON object that has a subset of the attributes of
|
77
|
-
# another JSON object by specifying which to drop. The following are equivalent:
|
78
|
-
# r({:a => 1, :b => 2, :c => 3}).without(:a, :c)
|
79
|
-
# r({:b => 2})
|
80
|
-
def unpick(*attrnames)
|
81
|
-
JSON_Expression.new [:call, [:unpick, *attrnames], [self]]
|
82
|
-
end
|
83
|
-
|
84
|
-
# Convert from an array to a stream. While most sequence functions are polymorphic
|
85
|
-
# and handle both arrays and streams, when arrays or streams need to be
|
86
|
-
# combined (e.g. via <b>+union+</b>) you need to explicitly convert between
|
87
|
-
# the types. This is mostly for safety, but also because which type you're
|
88
|
-
# working with affects error handling. The following are equivalent:
|
89
|
-
# r([1,2,3]).arraytostream
|
90
|
-
# r([1,2,3]).to_stream
|
91
|
-
def array_to_stream(); Stream_Expression.new [:call, [:array_to_stream], [self]]; end
|
92
|
-
|
93
|
-
# Prefix numeric -. The following are equivalent:
|
94
|
-
# -r(1)
|
95
|
-
# r(-1)
|
96
|
-
def -@; JSON_Expression.new [:call, [:subtract], [self]]; end
|
97
|
-
# Prefix numeric +. The following are equivalent:
|
98
|
-
# +r(-1)
|
99
|
-
# r(-1)
|
100
|
-
def +@; JSON_Expression.new [:call, [:add], [self]]; end
|
101
|
-
end
|
102
|
-
|
103
|
-
# A query representing a variable. Produced by e.g. RQL::letvar. This
|
104
|
-
# is its own class because it needs to behave correctly when spliced
|
105
|
-
# into a string (see RQL::js).
|
106
|
-
class Var_Expression < JSON_Expression
|
107
|
-
# Convert from an RQL query representing a variable to the name of that
|
108
|
-
# variable. Used e.g. in constructing javascript functions.
|
109
|
-
def to_s
|
110
|
-
if @body.class == Array and @body[0] == :var
|
111
|
-
then @body[1]
|
112
|
-
else raise TypeError, 'Can only call to_s on RQL_Queries representing variables.'
|
113
|
-
end
|
114
|
-
end
|
115
|
-
end
|
116
|
-
|
117
|
-
# Like Multi_Row_Selection, but for a single row. E.g.:
|
118
|
-
# table.get(0)
|
119
|
-
# yields a Single_Row_Selection
|
120
|
-
class Single_Row_Selection < JSON_Expression
|
121
|
-
# Analagous to Multi_Row_Selection#update
|
122
|
-
def update(variant=nil)
|
123
|
-
S.with_var {|vname,v|
|
124
|
-
Write_Query.new [:pointupdate, *(@body[1..-1] + [[vname, S.r(yield(v))]])]
|
125
|
-
}.apply_variant(variant)
|
126
|
-
end
|
127
|
-
|
128
|
-
# Analagous to Multi_Row_Selection#mutate
|
129
|
-
def replace(variant=nil)
|
130
|
-
S.with_var {|vname,v|
|
131
|
-
Write_Query.new [:pointreplace, *(@body[1..-1] + [[vname, S.r(yield(v))]])]
|
132
|
-
}.apply_variant(variant)
|
133
|
-
end
|
134
|
-
|
135
|
-
# Analagous to Multi_Row_Selection#delete
|
136
|
-
def delete
|
137
|
-
Write_Query.new [:pointdelete, *(@body[1..-1])]
|
138
|
-
end
|
139
|
-
end
|
140
|
-
end
|
data/lib/protob_compiler.rb
DELETED
@@ -1,137 +0,0 @@
|
|
1
|
-
# Copyright 2010-2012 RethinkDB, all rights reserved.
|
2
|
-
module RethinkDB
|
3
|
-
module RQL_Protob_Mixin
|
4
|
-
include P_Mixin
|
5
|
-
@@token = 0 # We need a new token every time we compile a query
|
6
|
-
@@backtrace = []
|
7
|
-
|
8
|
-
# Right now the only special case is :compare, but in general we might have
|
9
|
-
# terms that don't follow the conventions and we need a place to store that.
|
10
|
-
def handle_special_cases(message, query_type, query_args)
|
11
|
-
#PP.pp ["special_case", message, query_type, query_args]
|
12
|
-
case query_type
|
13
|
-
when :compare then
|
14
|
-
message.comparison = enum_type(Builtin::Comparison, *query_args)
|
15
|
-
throw :unknown_comparator_error if not message.comparison
|
16
|
-
return true
|
17
|
-
else return false
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
################################################################################
|
22
|
-
# I apologize for the code after this. I was originally doing something
|
23
|
-
# clever to generate the S-expressions, so they don't always match the
|
24
|
-
# protobufs perfectly, and the complexity necessary to handle that got
|
25
|
-
# pushed down into protobuf compilation. Later the cleverness went away,
|
26
|
-
# but I left the code below intact rather than refactoring for two reasons:
|
27
|
-
# 1) It's fragile and took about a day to get right, so refactoring it
|
28
|
-
# probably isn't free.
|
29
|
-
# 2) We are probably going to have to change protobuf implementations for
|
30
|
-
# speed reasons anyway, at which point this will have to be rewritten,
|
31
|
-
# and rewriting it twice doesn't make sense
|
32
|
-
################################################################################
|
33
|
-
|
34
|
-
# Compile an RQL query into a protobuf.
|
35
|
-
def comp(message_class, args, repeating=false)
|
36
|
-
# H4x to make the backtraces print right until we fix the protobuf.
|
37
|
-
message_class = S.rewrite(message_class);
|
38
|
-
#PP.pp(["A", message_class, args, repeating]) #DEBUG
|
39
|
-
|
40
|
-
# Handle special cases of arguments:
|
41
|
-
# * When we're compiling a repeating term, in which case we want to
|
42
|
-
# compile the elements of [args] rather than [args] itself.
|
43
|
-
# * Objects, which correspond to optional argument specifications.
|
44
|
-
# * Empty arguments
|
45
|
-
return args.map {|arg| comp(message_class, arg)} if repeating
|
46
|
-
args = args[0] if args.class == Array and args[0].class == Hash
|
47
|
-
raise TypeError,"Can't build #{message_class} from #{args.inspect}." if args == []
|
48
|
-
|
49
|
-
# Handle terminal parts of the protobuf, where we have to actually pack values.
|
50
|
-
if message_class.kind_of? Symbol
|
51
|
-
# It's easier for the user if we allow both atoms and 1-element lists
|
52
|
-
args = [args] if args.class != Array
|
53
|
-
if args.length != 1
|
54
|
-
then raise TypeError,"Can't build #{message_class} from #{args.inspect}." end
|
55
|
-
# Coercing symbols into strings makes our attribute notation more consistent
|
56
|
-
args[0] = args[0].to_s if args[0].class == Symbol
|
57
|
-
return args[0]
|
58
|
-
end
|
59
|
-
|
60
|
-
# Handle nonterminal parts of the protobuf, where we have to descend
|
61
|
-
message = message_class.new
|
62
|
-
if (message_type_class = C.class_types[message_class])
|
63
|
-
query_type = S.rewrite(args[0]) # Our first argument is the type of our variant.
|
64
|
-
message.type = enum_type(message_type_class, query_type)
|
65
|
-
raise TypeError,"No type '#{query_type}' for '#{message_class}'."if !message.type
|
66
|
-
|
67
|
-
if args.length == 1 # Our variant takes no arguments of its own.
|
68
|
-
return message
|
69
|
-
else # Compile our variant's arguments.
|
70
|
-
query_args = args[1..-1]
|
71
|
-
query_args = [query_args] if C.trampolines.include? query_type
|
72
|
-
return message if handle_special_cases(message, query_type, query_args)
|
73
|
-
|
74
|
-
# The general, non-special case.
|
75
|
-
query_type = C.query_rewrites[query_type] || query_type
|
76
|
-
field_metadata = message_class.fields.select{|x,y| y.name==query_type}.to_a[0]
|
77
|
-
if not field_metadata
|
78
|
-
then raise ArgumentError,"No field '#{query_type}' in '#{message_class}'." end
|
79
|
-
field = field_metadata[1]
|
80
|
-
message_set(message, query_type,
|
81
|
-
comp(field.type, query_args,field.rule==:repeated))
|
82
|
-
end
|
83
|
-
# Handle cases where we aren't constructing a toplevel variant type.
|
84
|
-
elsif args.class == Array
|
85
|
-
# Handle the case where we're constructinga the fields in order.
|
86
|
-
args = args.map{|x| x == nil ? RQL.expr(x) : x}
|
87
|
-
fields = message.fields.sort_by {|kv| kv[0]}
|
88
|
-
fields.zip(args).each {|_params|;field = _params[0][1];arg = _params[1]
|
89
|
-
if arg == S.skip
|
90
|
-
if field.rule != :optional
|
91
|
-
raise RuntimeError, "Cannot skip non-optional rule."
|
92
|
-
end
|
93
|
-
else
|
94
|
-
message_set(message, field.name,
|
95
|
-
comp(field.type, arg, field.rule==:repeated)) if arg != nil
|
96
|
-
end
|
97
|
-
}
|
98
|
-
else
|
99
|
-
# Handle the case where the user provided neither an Array nor a Hash,
|
100
|
-
# in which case they probably provided an Atom that we should treat as a
|
101
|
-
# single argument (allowing this makes the interface cleaner).
|
102
|
-
message = comp(message_class, [args], repeating)
|
103
|
-
end
|
104
|
-
return message
|
105
|
-
rescue => e # Add our own, semantic backtrace to exceptions
|
106
|
-
new_msg = repeating ? e.message :
|
107
|
-
e.message + "\n...when compiling #{message_class} with:\n#{args.pretty_inspect}"
|
108
|
-
raise e.class, new_msg
|
109
|
-
end
|
110
|
-
|
111
|
-
def handle_special_query_cases(sexp)
|
112
|
-
if C.nonatomic_variants.include?(sexp[0])
|
113
|
-
sexp[0] = sexp[0].to_s.split('_')[0].to_sym
|
114
|
-
res = query(sexp)
|
115
|
-
res.write_query.atomic = false
|
116
|
-
return res
|
117
|
-
end
|
118
|
-
return nil
|
119
|
-
end
|
120
|
-
|
121
|
-
# Construct a protobuf query from an RQL query by inferring the query type.
|
122
|
-
def query(sexp)
|
123
|
-
raise TypeError, "Cannot build query from #{sexp.inspect}" if sexp.class != Array
|
124
|
-
if (m = handle_special_query_cases(sexp))
|
125
|
-
then q = m
|
126
|
-
elsif enum_type(WriteQuery::WriteQueryType, S.rewrite(sexp[0]))
|
127
|
-
then q = comp(Query, [:write, *sexp])
|
128
|
-
elsif enum_type(MetaQuery::MetaQueryType, sexp[0])
|
129
|
-
then q = comp(Query, [:meta, *sexp])
|
130
|
-
else q = comp(Query, [:read, sexp])
|
131
|
-
end
|
132
|
-
q.token = (@@token += 1)
|
133
|
-
return q
|
134
|
-
end
|
135
|
-
end
|
136
|
-
module RQL_Protob; extend RQL_Protob_Mixin; end
|
137
|
-
end
|