Skip to content

Commit e24b8bc

Browse files
authored
Merge pull request #83 from nrkno/collect-too-deep
BQFrag.collect is traversing too deep
2 parents 4f84297 + b359a99 commit e24b8bc

File tree

2 files changed

+43
-1
lines changed

2 files changed

+43
-1
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@ sealed trait BQSqlFrag {
7979
case BQSqlFrag.Call(_, args) => args
8080
case BQSqlFrag.Combined(values) => values.toList
8181
case BQSqlFrag.PartitionRef(_) => Nil
82-
case BQSqlFrag.FillRef(fill) => fill.query :: Nil
82+
case BQSqlFrag.FillRef(_) => Nil
8383
case BQSqlFrag.FilledTableRef(_) => Nil
8484
}
8585

core/src/test/scala/no/nrk/bigquery/BQSqlFragTest.scala

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package no.nrk.bigquery
22

33
import cats.syntax.all._
4+
import com.google.cloud.bigquery.Field.Mode
5+
import com.google.cloud.bigquery.StandardSQLTypeName
46
import munit.FunSuite
57
import no.nrk.bigquery.BQPartitionType.DatePartitioned
68
import no.nrk.bigquery.syntax._
@@ -70,4 +72,44 @@ class BQSqlFragTest extends FunSuite {
7072
assertEquals(tableIds, t2.tableId :: t1.tableId :: t3.tableId :: Nil)
7173
}
7274

75+
test("collect UDF used in body in other fragments, but not child BQFill") {
76+
case class JobKey(value: String) extends JobKeyBQ
77+
78+
val outerUdf1 = UDF.temporary(
79+
Ident("outer1"),
80+
List(UDF.Param("input", BQType.INT64)),
81+
UDF.Body.Sql(bqsql"(2.0)"),
82+
Some(BQType.FLOAT64))
83+
84+
val outerUdf2 = UDF.temporary(
85+
Ident("outer2"),
86+
List(UDF.Param("input", BQType.INT64)),
87+
UDF.Body.Sql(bqsql"(1.0)"),
88+
Some(BQType.FLOAT64))
89+
90+
val fill2 = BQFill(JobKey("hello2"), mkTable("bree"), bqsql"select ${outerUdf2(1)}", LocalDate.of(2023, 1, 1))
91+
92+
val fill1 = BQFill(
93+
JobKey("hello"),
94+
mkTable("baz"),
95+
bqsql"select ${outerUdf1(1)} from $fill2",
96+
LocalDate.of(2023, 1, 1)
97+
)
98+
99+
val udfIdents = fill1.query
100+
.collect { case BQSqlFrag.Call(udf, _) => udf }
101+
.map(_.name)
102+
103+
assertEquals(udfIdents, outerUdf1.name :: Nil)
104+
}
105+
106+
def mkTable(name: String) = {
107+
val partitionField = BQField("partitionDate", StandardSQLTypeName.DATE, Mode.REQUIRED)
108+
109+
BQTableDef.Table(
110+
BQTableId.of(ProjectId("foo"), "bar", name),
111+
BQSchema.of(partitionField, BQField("num", StandardSQLTypeName.FLOAT64, Mode.REQUIRED)),
112+
BQPartitionType.DatePartitioned(partitionField.ident)
113+
)
114+
}
73115
}

0 commit comments

Comments
 (0)