Skip to content

Commit 140f60f

Browse files
committed
update validator suggestions for missing required fields
1 parent be352d9 commit 140f60f

File tree

2 files changed

+24
-9
lines changed

2 files changed

+24
-9
lines changed

macros-tests/src/test/scala/app/softnetwork/elastic/sql/macros/SQLQueryValidatorSpec.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ class SQLQueryValidatorSpec extends AnyFlatSpec with Matchers {
167167
case class WrongTypes(id: Int, name: Int)
168168
169169
TestElasticClientApi.searchAs[WrongTypes](
170-
"SELECT id::LONG, name FROM products"
170+
"SELECT id::BIGINT, name FROM products"
171171
)""")
172172
}
173173

macros/src/main/scala/app/softnetwork/elastic/sql/macros/SQLQueryValidator.scala

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,17 @@ trait SQLQueryValidator {
7272

7373
debug(c)(s"🔍 Unnested collections: ${unnestedCollections.mkString(", ")}")
7474

75-
// ✅ Recursive validation of required fields
76-
validateRequiredFieldsRecursively(c)(tpe, queryFields, unnestedCollections, prefix = "")
77-
7875
// ✅ Recursive validation of unknown fields
79-
validateUnknownFieldsRecursively(c)(tpe, queryFields, prefix = "")
76+
val unknownFields = validateUnknownFieldsRecursively(c)(tpe, queryFields, prefix = "")
77+
78+
// ✅ Recursive validation of required fields
79+
validateRequiredFieldsRecursively(c)(
80+
tpe,
81+
queryFields,
82+
unknownFields,
83+
unnestedCollections,
84+
prefix = ""
85+
)
8086

8187
// ✅ Extract required fields from the case class
8288
val requiredFields = getRequiredFields(c)(tpe)
@@ -338,6 +344,7 @@ trait SQLQueryValidator {
338344
)(
339345
tpe: c.universe.Type,
340346
queryFields: Set[String],
347+
unknownFields: Set[String],
341348
unnestedCollections: Set[String],
342349
prefix: String
343350
): Unit = {
@@ -383,6 +390,7 @@ trait SQLQueryValidator {
383390
fieldName,
384391
fieldType,
385392
queryFields,
393+
unknownFields,
386394
unnestedCollections,
387395
tpe
388396
)
@@ -428,6 +436,7 @@ trait SQLQueryValidator {
428436
validateRequiredFieldsRecursively(c)(
429437
fieldType,
430438
queryFields,
439+
unknownFields,
431440
unnestedCollections,
432441
fullFieldName
433442
)
@@ -439,9 +448,11 @@ trait SQLQueryValidator {
439448
// ❌ Required field is not selected at all
440449
debug(c)(s"❌ Field '$fullFieldName' is missing")
441450

442-
val exampleFields = (queryFields + fullFieldName).mkString(", ")
443-
val suggestions = findClosestMatch(fieldName, queryFields.map(_.split("\\.").last).toSeq)
444-
val suggestionMsg = suggestions.map(s => s"\nDid you mean: $s?").getOrElse("")
451+
val exampleFields = ((queryFields -- unknownFields) + fullFieldName).mkString(", ")
452+
val suggestions = findClosestMatch(fieldName, unknownFields.map(_.split("\\.").last).toSeq)
453+
val suggestionMsg = suggestions
454+
.map(s => s"\nYou have selected unknown field \"$s\", did you mean \"$fullFieldName\"?")
455+
.getOrElse("")
445456

446457
c.abort(
447458
c.enclosingPosition,
@@ -471,6 +482,7 @@ trait SQLQueryValidator {
471482
fieldName: String,
472483
fieldType: c.universe.Type,
473484
queryFields: Set[String],
485+
unknownFields: Set[String],
474486
unnestedCollections: Set[String],
475487
parentType: c.universe.Type
476488
): Unit = {
@@ -526,6 +538,7 @@ trait SQLQueryValidator {
526538
validateRequiredFieldsRecursively(c)(
527539
elementType,
528540
queryFields,
541+
unknownFields,
529542
unnestedCollections,
530543
fullFieldName
531544
)
@@ -575,7 +588,7 @@ trait SQLQueryValidator {
575588
tpe: c.universe.Type,
576589
queryFields: Set[String],
577590
prefix: String
578-
): Unit = {
591+
): Set[String] = {
579592

580593
// ✅ Get all valid field paths at this level and below
581594
val validFieldPaths = buildValidFieldPaths(c)(tpe, prefix)
@@ -601,6 +614,8 @@ trait SQLQueryValidator {
601614
|""".stripMargin
602615
)
603616
}
617+
618+
unknownFields
604619
}
605620

606621
// ============================================================

0 commit comments

Comments
 (0)