fix: use numeric comparison for MIN/MAX aggregates
CI / test (push) Has been cancelled
CI / verify (push) Has been cancelled
Clients CI / build-server (push) Has been cancelled
Clients CI / test-python (push) Has been cancelled
Clients CI / test-javascript (push) Has been cancelled
Clients CI / test-nim (push) Has been cancelled
Clients CI / test-rust (push) Has been cancelled
CI / test (push) Has been cancelled
CI / verify (push) Has been cancelled
Clients CI / build-server (push) Has been cancelled
Clients CI / test-python (push) Has been cancelled
Clients CI / test-javascript (push) Has been cancelled
Clients CI / test-nim (push) Has been cancelled
Clients CI / test-rust (push) Has been cancelled
This commit is contained in:
@@ -24,6 +24,24 @@ import ../storage/wal
|
|||||||
import ../core/mvcc
|
import ../core/mvcc
|
||||||
import ../core/tracing
|
import ../core/tracing
|
||||||
import ../fts/engine as fts
|
import ../fts/engine as fts
|
||||||
|
|
||||||
|
proc cmpMax(a, b: string): bool =
|
||||||
|
var fa, fb: float
|
||||||
|
try:
|
||||||
|
fa = parseFloat(a)
|
||||||
|
fb = parseFloat(b)
|
||||||
|
result = fa > fb
|
||||||
|
except ValueError:
|
||||||
|
result = a > b
|
||||||
|
|
||||||
|
proc cmpMin(a, b: string): bool =
|
||||||
|
var fa, fb: float
|
||||||
|
try:
|
||||||
|
fa = parseFloat(a)
|
||||||
|
fb = parseFloat(b)
|
||||||
|
result = fa < fb
|
||||||
|
except ValueError:
|
||||||
|
result = a < b
|
||||||
import ../vector/engine as vengine
|
import ../vector/engine as vengine
|
||||||
import ../graph/engine as gengine
|
import ../graph/engine as gengine
|
||||||
import ../graph/community as gcomm
|
import ../graph/community as gcomm
|
||||||
@@ -2882,13 +2900,13 @@ proc executePlan*(ctx: ExecutionContext, plan: IRPlan): seq[Row] =
|
|||||||
var minVal = ""
|
var minVal = ""
|
||||||
for row in filteredRows:
|
for row in filteredRows:
|
||||||
let v = evalExpr(expr.aggArgs[0], row, ctx)
|
let v = evalExpr(expr.aggArgs[0], row, ctx)
|
||||||
if minVal == "" or v < minVal: minVal = v
|
if minVal == "" or cmpMin(v, minVal): minVal = v
|
||||||
newRow[alias] = minVal
|
newRow[alias] = minVal
|
||||||
of irMax:
|
of irMax:
|
||||||
var maxVal = ""
|
var maxVal = ""
|
||||||
for row in filteredRows:
|
for row in filteredRows:
|
||||||
let v = evalExpr(expr.aggArgs[0], row, ctx)
|
let v = evalExpr(expr.aggArgs[0], row, ctx)
|
||||||
if maxVal == "" or v > maxVal: maxVal = v
|
if maxVal == "" or cmpMax(v, maxVal): maxVal = v
|
||||||
newRow[alias] = maxVal
|
newRow[alias] = maxVal
|
||||||
of irArrayAgg:
|
of irArrayAgg:
|
||||||
var arr: seq[string]
|
var arr: seq[string]
|
||||||
@@ -3057,13 +3075,13 @@ proc executePlan*(ctx: ExecutionContext, plan: IRPlan): seq[Row] =
|
|||||||
var minVal = ""
|
var minVal = ""
|
||||||
for row in filteredRows:
|
for row in filteredRows:
|
||||||
let v = evalExpr(aggExpr.aggArgs[0], row, ctx)
|
let v = evalExpr(aggExpr.aggArgs[0], row, ctx)
|
||||||
if minVal == "" or v < minVal: minVal = v
|
if minVal == "" or cmpMin(v, minVal): minVal = v
|
||||||
aggRow[aggKey] = minVal
|
aggRow[aggKey] = minVal
|
||||||
of irMax:
|
of irMax:
|
||||||
var maxVal = ""
|
var maxVal = ""
|
||||||
for row in filteredRows:
|
for row in filteredRows:
|
||||||
let v = evalExpr(aggExpr.aggArgs[0], row, ctx)
|
let v = evalExpr(aggExpr.aggArgs[0], row, ctx)
|
||||||
if maxVal == "" or v > maxVal: maxVal = v
|
if maxVal == "" or cmpMax(v, maxVal): maxVal = v
|
||||||
aggRow[aggKey] = maxVal
|
aggRow[aggKey] = maxVal
|
||||||
of irArrayAgg:
|
of irArrayAgg:
|
||||||
var arr: seq[string]
|
var arr: seq[string]
|
||||||
@@ -3550,13 +3568,13 @@ proc executePlan*(ctx: ExecutionContext, plan: IRPlan): seq[Row] =
|
|||||||
var minVal = ""
|
var minVal = ""
|
||||||
for row in matchingRows:
|
for row in matchingRows:
|
||||||
let v = evalExpr(plan.pivotAgg.aggArgs[0], row, ctx)
|
let v = evalExpr(plan.pivotAgg.aggArgs[0], row, ctx)
|
||||||
if minVal == "" or v < minVal: minVal = v
|
if minVal == "" or cmpMin(v, minVal): minVal = v
|
||||||
aggResult = minVal
|
aggResult = minVal
|
||||||
of irMax:
|
of irMax:
|
||||||
var maxVal = ""
|
var maxVal = ""
|
||||||
for row in matchingRows:
|
for row in matchingRows:
|
||||||
let v = evalExpr(plan.pivotAgg.aggArgs[0], row, ctx)
|
let v = evalExpr(plan.pivotAgg.aggArgs[0], row, ctx)
|
||||||
if maxVal == "" or v > maxVal: maxVal = v
|
if maxVal == "" or cmpMax(v, maxVal): maxVal = v
|
||||||
aggResult = maxVal
|
aggResult = maxVal
|
||||||
else: discard
|
else: discard
|
||||||
# Clean pivot value (remove quotes)
|
# Clean pivot value (remove quotes)
|
||||||
|
|||||||
Reference in New Issue
Block a user