Skip to content

Commit e3834ab

Browse files
committed
fast path for flatten rec
1 parent ea1b1f7 commit e3834ab

File tree

1 file changed

+34
-25
lines changed

1 file changed

+34
-25
lines changed

scalasql/core/src/SqlStr.scala

Lines changed: 34 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -85,14 +85,8 @@ object SqlStr {
8585

8686
def rec(self: SqlStr, topLevel: Boolean): Unit = {
8787
val queryParts = self.queryParts
88-
val params = self.interps
89-
finalExprs.addAll(self.referencedExprs)
90-
var boundary = true
91-
val parenthesize = !topLevel && self.isCompleteQuery
92-
if (parenthesize) addFinalPart("(")
93-
boundary = true
94-
95-
def addFinalPart(s: CharSequence) = {
88+
89+
def addFinalPart(boundary: Boolean, s: CharSequence) = {
9690
if (boundary && lastFinalPart != null) {
9791
lastFinalPart.append(s)
9892
} else {
@@ -101,26 +95,41 @@ object SqlStr {
10195
finalParts.addOne(lastFinalPart)
10296
}
10397
}
98+
queryParts.length match{
99+
case 0 => // do nothing
100+
case 1 =>
101+
addFinalPart(true, queryParts.head)
102+
finalExprs.addAll(self.referencedExprs)
103+
case _ =>
104+
val params = self.interps
105+
finalExprs.addAll(self.referencedExprs)
106+
var boundary = true
107+
val parenthesize = !topLevel && self.isCompleteQuery
108+
if (parenthesize) addFinalPart(boundary, "(")
109+
boundary = true
110+
111+
112+
var i = 0
113+
val length = params.length
114+
while (i < length) {
115+
val p = queryParts(i)
116+
val a = params(i)
117+
addFinalPart(boundary, p)
118+
boundary = false
119+
a match {
120+
case si: Interp.SqlStrInterp =>
121+
rec(si.s, false)
122+
boundary = true
123+
124+
case s: Interp.TypeInterp[_] => finalInterps.addOne(s)
125+
}
126+
i += 1
127+
}
104128

105-
var i = 0
106-
val length = params.length
107-
while (i < length) {
108-
val p = queryParts(i)
109-
val a = params(i)
110-
addFinalPart(p)
111-
boundary = false
112-
a match {
113-
case si: Interp.SqlStrInterp =>
114-
rec(si.s, false)
115-
boundary = true
116-
117-
case s: Interp.TypeInterp[_] => finalInterps.addOne(s)
118-
}
119-
i += 1
129+
addFinalPart(boundary, queryParts.last)
130+
if (parenthesize) addFinalPart(boundary, ")")
120131
}
121132

122-
addFinalPart(queryParts.last)
123-
if (parenthesize) addFinalPart(")")
124133
}
125134

126135
rec(self, true)

0 commit comments

Comments
 (0)