@@ -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 " \n Did 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 " \n You 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