You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@texera.apache.org by "AnzhiZhang (via GitHub)" <gi...@apache.org> on 2025/08/25 05:59:15 UTC

[I] `require = true` does not validate empty string in frontend [texera]

AnzhiZhang opened a new issue, #3692:
URL: https://github.com/apache/texera/issues/3692

   ## Problem
   
   Currently, we have many operator descriptions using `@JsonProperty(required = true)` on string fields. For example, chart operators (see #3192).
   
   https://github.com/apache/texera/blob/c7fcd9f4278f850e3c1456866ba6f25f85a8f489/core/workflow-operator/src/main/scala/edu/uci/ics/amber/operator/visualization/barChart/BarChartOpDesc.scala#L41-L70
   
   For example, if we have this class.
   
   ```scala
   import com.fasterxml.jackson.annotation.JsonProperty
   
   class Test {
     @JsonProperty(value = "test", required = true)
     var test: String = ""
   }
   ```
   
   The JSON schema will be
   
   ```json
   {
     "$schema" : "http://json-schema.org/draft-07/schema#",
     "type" : "object",
     "additionalProperties" : false,
     "properties" : {
       "test" : {
         "propertyOrder" : 1,
         "type" : "string",
         "title" : "Test"
       }
     },
     "required" : [ "test" ]
   }
   ```
   
   We are using [Ajv](https://github.com/ajv-validator/ajv) in the frontend to validate JSON schema, if we test this schema in the frontend (a simple example).
   
   ```ts
   import Ajv from "ajv";
   
   const ajv = new Ajv({ allErrors: true, strict: false });
   const schema = {
     type: "object",
     properties: {
       test: {
         type: "string",
       },
     },
     required: ["test"],
   };
   
   const json = {
     test: "",
   };
   
   // true
   console.log(ajv.validate(schema, json));
   
   const json2 = {};
   
   // false
   console.log(ajv.validate(schema, json2));
   ```
   
   It only works for a real null property, not an empty string.
   
   The debug information confirms this finding.
   
   <img width="2360" height="1030" alt="Image" src="https://github.com/user-attachments/assets/9d7e1876-9dfe-40b2-862c-0dadc16fcab7" />
   
   <img width="2384" height="812" alt="Image" src="https://github.com/user-attachments/assets/8e0f026c-37a7-4070-8516-347589559f86" />
   
   ## Solution
   
   We will need to add `@NotNull` annotation from `javax.validation.constraints.NotNull` to introduce `"minLength" : 1,` requirement to the JSON Schema (https://github.com/ajv-validator/ajv/issues/885#issuecomment-441749423).
   
   ```java
   import com.fasterxml.jackson.annotation.JsonProperty
   import javax.validation.constraints.NotNull
   
   class Test {
     @JsonProperty(value = "test", required = true)
     @NotNull(message = "test cannot be empty")
     var test: String = ""
   }
   ```
   
   Will generate the schema.
   
   ```json
   {
     "$schema" : "http://json-schema.org/draft-07/schema#",
     "type" : "object",
     "additionalProperties" : false,
     "properties" : {
       "test" : {
         "propertyOrder" : 1,
         "type" : "string",
         "minLength" : 1,
         "title" : "Test"
       }
     },
     "required" : [ "test" ]
   }
   ```
   
   To test it.
   
   ```ts
   const schema2 = {
     type: "object",
     properties: {
       test: {
         type: "string",
         minLength : 1,
       },
     },
     required: ["test"],
   };
   
   // false
   console.log(ajv.validate(schema2, json));
   ```
   
   ## Alternative Solutions
   
   To validate "empty string" (in the context of Java empty string, which is 0 length) in Ajv, the only solution is `minLength`, a more detailed discussion can be found here (https://stackoverflow.com/a/47471462/19420247)
   
   1. Use `javax.validation.constraints.Pattern` to validate by regex pattern, which also resolves the issue if the input string that all chars are spaces, but may require more performance and is not consistent with Java.
   2. Catch error from backend. This is a workaround, as we are expecting to validate at the frontend. If we choose this solution, the validation status at the front will be valid at first, then turn to invalid. This will reflect on the Run button (flash).
   
   ## Related Issues
   
   - #3656 
   - #3192
   - https://github.com/ajv-validator/ajv/issues/885#issuecomment-441749423


-- 
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: dev-unsubscribe@texera.apache.org.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [I] Require Attribute Name to be Not Blank [texera]

Posted by "AnzhiZhang (via GitHub)" <gi...@apache.org>.
AnzhiZhang commented on issue #3692:
URL: https://github.com/apache/texera/issues/3692#issuecomment-3230132435

   <details>
    <summary>Origin issue, for reference only, no need to read.</summary>
   
   ## Problem
   
   Currently, we have many operator descriptions using `@JsonProperty(required = true)` on string fields. For example, chart operators (see #3192).
   
   https://github.com/apache/texera/blob/c7fcd9f4278f850e3c1456866ba6f25f85a8f489/core/workflow-operator/src/main/scala/edu/uci/ics/amber/operator/visualization/barChart/BarChartOpDesc.scala#L41-L70
   
   For example, if we have this class.
   
   ```scala
   import com.fasterxml.jackson.annotation.JsonProperty
   
   class Test {
     @JsonProperty(value = "test", required = true)
     var test: String = ""
   }
   ```
   
   The JSON schema will be
   
   ```json
   {
     "$schema" : "http://json-schema.org/draft-07/schema#",
     "type" : "object",
     "additionalProperties" : false,
     "properties" : {
       "test" : {
         "propertyOrder" : 1,
         "type" : "string",
         "title" : "Test"
       }
     },
     "required" : [ "test" ]
   }
   ```
   
   We are using [Ajv](https://github.com/ajv-validator/ajv) in the frontend to validate JSON schema, if we test this schema in the frontend (a simple example).
   
   ```ts
   import Ajv from "ajv";
   
   const ajv = new Ajv({ allErrors: true, strict: false });
   const schema = {
     type: "object",
     properties: {
       test: {
         type: "string",
       },
     },
     required: ["test"],
   };
   
   const json = {
     test: "",
   };
   
   // true
   console.log(ajv.validate(schema, json));
   
   const json2 = {};
   
   // false
   console.log(ajv.validate(schema, json2));
   ```
   
   It only works for a real null property, not an empty string.
   
   The debug information confirms this finding.
   
   <img width="2360" height="1030" alt="Image" src="https://github.com/user-attachments/assets/9d7e1876-9dfe-40b2-862c-0dadc16fcab7" />
   
   <img width="2384" height="812" alt="Image" src="https://github.com/user-attachments/assets/8e0f026c-37a7-4070-8516-347589559f86" />
   
   ## Solution
   
   We will need to add `@NotNull` annotation from `javax.validation.constraints.NotNull` to introduce `"minLength" : 1,` requirement to the JSON Schema (https://github.com/ajv-validator/ajv/issues/885#issuecomment-441749423).
   
   ```java
   import com.fasterxml.jackson.annotation.JsonProperty
   import javax.validation.constraints.NotNull
   
   class Test {
     @JsonProperty(value = "test", required = true)
     @NotNull(message = "test cannot be empty")
     var test: String = ""
   }
   ```
   
   Will generate the schema.
   
   ```json
   {
     "$schema" : "http://json-schema.org/draft-07/schema#",
     "type" : "object",
     "additionalProperties" : false,
     "properties" : {
       "test" : {
         "propertyOrder" : 1,
         "type" : "string",
         "minLength" : 1,
         "title" : "Test"
       }
     },
     "required" : [ "test" ]
   }
   ```
   
   To test it.
   
   ```ts
   const schema2 = {
     type: "object",
     properties: {
       test: {
         type: "string",
         minLength : 1,
       },
     },
     required: ["test"],
   };
   
   // false
   console.log(ajv.validate(schema2, json));
   ```
   
   ## Alternative Solutions
   
   To validate "empty string" (in the context of Java empty string, which is 0 length) in Ajv, the only solution is `minLength`, a more detailed discussion can be found here (https://stackoverflow.com/a/47471462/19420247)
   
   1. Use `javax.validation.constraints.Pattern` to validate by regex pattern, which also resolves the issue if the input string that all chars are spaces, but may require more performance and is not consistent with Java.
   2. Catch error from backend. This is a workaround, as we are expecting to validate at the frontend. If we choose this solution, the validation status at the front will be valid at first, then turn to invalid. This will reflect on the Run button (flash).
   
   ## Demo
   
   This demo shows the effect of adding `@NotNull`. The bar chart operator is edited to have `@NotNull`. When adding the bar chart operator, the workflow is consistently invalid. However, without this requirement on the dot plot operator, the workflow changes to valid sometimes because these validations are passed due to empty string attributes (see debug screenshots above).
   
   https://github.com/user-attachments/assets/067a7e84-b4e4-4a5c-b83a-b5a320914f6c
   
   ## Related Issues
   
   - #3656 
   - #3192
   - https://github.com/ajv-validator/ajv/issues/885#issuecomment-441749423
   
   </details>


-- 
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: dev-unsubscribe@texera.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [I] Require Attribute Name to be Not Blank [texera]

Posted by "AnzhiZhang (via GitHub)" <gi...@apache.org>.
AnzhiZhang commented on issue #3692:
URL: https://github.com/apache/texera/issues/3692#issuecomment-3230161406

   As commented [here](https://github.com/apache/texera/pull/1277#pullrequestreview-719856905), we now have some load for us to maintain the JSON schema generator. [mbknor/mbknor-jackson-jsonSchema](https://github.com/mbknor/mbknor-jackson-jsonSchema) is not actively maintained. The last commit was 4 years ago, the last merged PR was in 2020, and the last maintainer involved issue was in 2021.


-- 
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: dev-unsubscribe@texera.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org


Re: [I] Require Attribute Name to be Not Blank [texera]

Posted by "chenlica (via GitHub)" <gi...@apache.org>.
chenlica closed issue #3692: Require Attribute Name to be Not Blank
URL: https://github.com/apache/texera/issues/3692


-- 
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: notifications-unsubscribe@texera.apache.org

For queries about this service, please contact Infrastructure at:
users@infra.apache.org