Skip to content

Commit ddd9192

Browse files
authored
Merge pull request #74 from nrkno/udf-live-test
Fix allReferencedUDFs
2 parents 34ef52a + c8f6499 commit ddd9192

File tree

4 files changed

+59
-2
lines changed

4 files changed

+59
-2
lines changed

core/src/main/scala/no/nrk/bigquery/BQSqlFrag.scala

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,35 @@ sealed trait BQSqlFrag {
106106
case BQSqlFrag.FilledTableRef(fill) => fill.tableDef.unpartitioned.assertPartition
107107
}.distinct
108108

109-
final def allReferencedUDFs: Seq[UDF[UDF.UDFId]] =
110-
this.collect { case BQSqlFrag.Call(udf, _) => udf }.distinct
109+
final def allReferencedUDFs: Seq[UDF[UDF.UDFId]] = {
110+
def fromBody(body: UDF.Body) =
111+
body match {
112+
case UDF.Body.Sql(body) => body.allReferencedUDFs
113+
case _: UDF.Body.Js => Nil
114+
}
115+
116+
this match {
117+
case BQSqlFrag.Frag(_) => Nil
118+
case BQSqlFrag.Call(udf @ UDF.Temporary(_, _, body, _), args) =>
119+
(fromBody(body) ++ args.flatMap(
120+
_.allReferencedUDFs
121+
) ++ List(udf)).distinct
122+
case BQSqlFrag.Call(udf @ UDF.Persistent(_, _, body, _), args) =>
123+
(fromBody(body) ++ args.flatMap(
124+
_.allReferencedUDFs
125+
) ++ List(udf)).distinct
126+
case BQSqlFrag.Call(udf: UDF.Reference, args) =>
127+
(args.flatMap(
128+
_.allReferencedUDFs
129+
) ++ List(udf)).distinct
130+
131+
case BQSqlFrag.Combined(values) =>
132+
values.flatMap(_.allReferencedUDFs).distinct
133+
case BQSqlFrag.PartitionRef(_) => Nil
134+
case BQSqlFrag.FillRef(_) => Nil
135+
case BQSqlFrag.FilledTableRef(_) => Nil
136+
}
137+
}
111138

112139
override def toString: String = asString
113140
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
CREATE TEMP FUNCTION xxdouble_TMP(input INT64) RETURNS INT64 AS ((input + input));
2+
CREATE TEMP FUNCTION half_TMP(input INT64) RETURNS FLOAT64 AS ((xxdouble_TMP(input) / 2));
3+
4+
select half_TMP(1)
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
CREATE TEMP FUNCTION xxdouble_TMP(input INT64) RETURNS INT64 AS ((input + input));
2+
3+
CREATE TEMP FUNCTION half_TMP(input INT64) RETURNS FLOAT64 AS ((xxdouble_TMP(input) / 2));
4+
5+
select half_TMP(1)
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package no.nrk.bigquery
2+
3+
import no.nrk.bigquery.syntax._
4+
import no.nrk.bigquery.testing.{BQSmokeTest, BigQueryTestClient}
5+
6+
class LiveTempUdfTest extends BQSmokeTest(BigQueryTestClient.testClient) {
7+
val udf1 = UDF.temporary(
8+
Ident("xxdouble_TMP"),
9+
List(UDF.Param("input", BQType.INT64)),
10+
UDF.Body.Sql(bqsql"(input + input)"),
11+
Some(BQType.INT64))
12+
val udf2 = UDF.temporary(
13+
Ident("half_TMP"),
14+
List(UDF.Param("input", BQType.INT64)),
15+
UDF.Body.Sql(bqsql"(${udf1(Ident("input"))} / 2)"),
16+
Some(BQType.FLOAT64))
17+
18+
bqTypeCheckTest("query with UDF") {
19+
BQQuery[Double](bqsql"select ${udf2(1)}")
20+
}
21+
}

0 commit comments

Comments
 (0)