11# All code is attached to its underlying database source
22struct SourceCode{Source}
33 source:: Source
4- code:: Expr
4+ code:: Union{ Expr, Nothing}
55end
66
7+ """
8+ struct BySQL{Source}
9+
10+ If you would like a statement to be evaluated by SQL, not Julia, and
11+ none of the arguments are SQL code, you can use BySQL to hack dispatch.
12+ """
13+ struct BySQL{Source}
14+ source:: Source
15+ end
16+
17+ export BySQL
18+
719# Every time `SourceCode` objects are combined, check to see whether they all come from the same source
820function pop_source! (sources, something)
921 something
@@ -12,18 +24,28 @@ function pop_source!(sources, source_code::SourceCode)
1224 push! (sources, source_code. source)
1325 source_code. code
1426end
27+ function pop_source! (sources, by_sql:: BySQL )
28+ push! (sources, by_sql. source)
29+ by_sql
30+ end
1531function key_pop_source! (sources, (key, source_code))
16- code = pop_source! (souces , source_code)
32+ code = pop_source! (sources , source_code)
1733 Expr (:kw , key, code)
1834end
1935
2036function combine_sources (a_function, source_codes... ; key_source_codes... )
2137 sources = Set (Any[])
22- codes = partial_map (pop_source!, sources, source_codes)
23- key_codes = (
38+ codes = [
39+ pop_source! (sources, source_code)
40+ for source_code in source_codes
41+ ]
42+ filter! (codes) do code
43+ ! (code isa BySQL)
44+ end
45+ key_codes = [
2446 key_pop_source! (sources, key_source_code)
2547 for key_source_code in key_source_codes
26- )
48+ ]
2749 if length (sources) != 1
2850 error (" Expected exactly one source; got ($(sources... ) )" )
2951 else
@@ -56,12 +78,12 @@ function code_instead(location, a_function, types...)
5678 arguments = ntuple (numbered_argument, length (types))
5779 keywords = Expr (:parameters , Expr (:... , :keywords ))
5880 Expr (:function ,
59- Expr (:call , a_function, keywords, map_unrolled (assert_type, arguments, types)... ),
81+ Expr (:call , a_function, keywords, map (assert_type, arguments, types)... ),
6082 Expr (:block , location, Expr (:call ,
6183 combine_sources,
6284 keywords,
6385 a_function,
64- map_unrolled (maybe_splat, arguments, types)...
86+ map (maybe_splat, arguments, types)...
6587 ))
6688 )
6789end
111133
112134@code_instead coalesce SourceCode Vararg{Any}
113135
136+ @code_instead convert Type{Int} SourceCode
137+
138+ # TODO : support dateformat
139+ @code_instead Date SourceCode
140+
141+ # TODO : support dateformat
142+ @code_instead DateTime SourceCode
143+
114144@code_instead QueryOperators. drop SourceCode Integer
115145
116146@code_instead QueryOperators. filter SourceCode Any Expr
@@ -164,18 +194,35 @@ end
164194
165195@code_instead QueryOperators. orderby_descending SourceCode Any Expr
166196
197+ @code_instead rand BySQL Type{Int}
198+
199+ # TODO : add more methods
200+ @code_instead replace SourceCode Pair
201+
202+ @code_instead repr SourceCode
203+
204+ @code_instead round SourceCode
205+
167206@code_instead secondary SourceCode
168207
208+ @code_instead strip SourceCode
209+ @code_instead strip SourceCode Char
210+
211+ @code_instead SubString SourceCode Number Number
212+ @code_instead SubString SourceCode Number
213+
214+ @code_instead sum SourceCode
215+
169216@code_instead QueryOperators. take SourceCode Any
170217
171218@code_instead QueryOperators. thenby SourceCode Any Expr
172219
173220@code_instead QueryOperators. thenby_descending SourceCode Any Expr
174221
175- @code_instead sum SourceCode
222+ # TODO : support dateformat
223+ @code_instead Time SourceCode
176224
177- @code_instead strip SourceCode
178- @code_instead strip SourceCode Char
225+ @code_instead type_of SourceCode
179226
180227# TODO : add more methods
181228@code_instead QueryOperators. unique SourceCode Any Expr
@@ -184,20 +231,10 @@ end
184231
185232# TODO : add
186233# printf
187- # quote
188- # random
189234# randomblob
190- # replace
191- # round
192- # substr
193- # typeof
194- # unicode
195235# zeroblob
196236# group_concat
197237# total
198- # date
199- # time
200- # datetime
201238# julianday
202239# strftime
203240
0 commit comments