rahil-c commented on code in PR #18797:
URL: https://github.com/apache/hudi/pull/18797#discussion_r3304699350
##########
hudi-spark-datasource/hudi-spark-common/src/main/scala/org/apache/spark/sql/hudi/analysis/HoodieSparkBaseAnalysis.scala:
##########
@@ -156,15 +156,17 @@ case class ResolveReferences(spark: SparkSession) extends
Rule[LogicalPlan]
val searchAlgorithm =
HoodieVectorSearchPlanBuilder.resolveAlgorithm(a.algorithm)
val corpusDf = resolveTableToDf(a.table,
HoodieVectorSearchTableValuedFunction.FUNC_NAME)
val queryVector = evaluateQueryVector(a.queryVectorExpr)
- searchAlgorithm.buildSingleQueryPlan(spark, corpusDf, a.embeddingCol,
queryVector, a.k, a.metric)
+ searchAlgorithm.buildSingleQueryPlan(
+ spark, corpusDf, a.embeddingCol, queryVector, a.k, a.metric, a.filter,
a.maxDistance)
case HoodieVectorSearchBatchTableValuedFunction(args) =>
val a = HoodieVectorSearchBatchTableValuedFunction.parseArgs(args)
val searchAlgorithm =
HoodieVectorSearchPlanBuilder.resolveAlgorithm(a.algorithm)
val corpusDf = resolveTableToDf(a.corpusTable,
HoodieVectorSearchBatchTableValuedFunction.FUNC_NAME)
val queryDf = resolveTableToDf(a.queryTable,
HoodieVectorSearchBatchTableValuedFunction.FUNC_NAME)
searchAlgorithm.buildBatchQueryPlan(
- spark, corpusDf, a.corpusEmbeddingCol, queryDf, a.queryEmbeddingCol,
a.k, a.metric)
+ spark, corpusDf, a.corpusEmbeddingCol, queryDf, a.queryEmbeddingCol,
Review Comment:
Nice callout @voonhous, will update this
##########
hudi-spark-datasource/hudi-spark-common/src/main/scala/org/apache/spark/sql/catalyst/plans/logical/HoodieVectorSearchTableValuedFunction.scala:
##########
@@ -106,6 +115,31 @@ object HoodieVectorSearchTableValuedFunction {
}
kValue
}
+
+ /** Parses a string argument that may be NULL (meaning "not specified"). */
+ private[logical] def parseOptionalString(
+ funcName: String, expr: Expression, argName: String): Option[String] =
expr match {
+ case Literal(null, _) => None
+ case Literal(v, StringType) if v != null =>
+ val s = v.toString.trim
+ if (s.isEmpty) None else Some(s)
+ case _ => throw new HoodieAnalysisException(
+ s"Function '$funcName': argument '$argName' must be a string literal or
NULL, got: ${expr.sql}")
+ }
+
+ /**
+ * Parses a numeric argument that may be NULL (meaning "not specified").
Accepts
+ * any [[NumericType]] literal (Int/Long/Float/Double/Decimal/Short/Byte) and
+ * widens to Double. String literals — even ones whose contents parse as a
+ * number — are rejected so the type contract surfaces at parse time.
+ */
+ private[logical] def parseOptionalDouble(
+ funcName: String, expr: Expression, argName: String): Option[Double] =
expr match {
+ case Literal(null, _) => None
+ case Literal(v, _: NumericType) if v != null => Some(v.toString.toDouble)
+ case _ => throw new HoodieAnalysisException(
+ s"Function '$funcName': argument '$argName' must be a numeric literal or
NULL, got: ${expr.sql}")
+ }
Review Comment:
+1
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]