[ASTERIXDB-3397][API]Add retriable flag to returned errors

- user model changes: no
- storage format changes: no
- interface changes: no

Change-Id: I65b31440b2a0570ab3d0533fde620a71476aa0b0
Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/18280
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Murtadha Hubail <mhubail@apache.org>
Tested-by: Peeyush Gupta <peeyush.gupta@couchbase.com>
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ResultUtil.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ResultUtil.java
index cf535d9..3b1b2e8 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ResultUtil.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/api/http/server/ResultUtil.java
@@ -110,6 +110,10 @@
         printFieldInternal(pw, name, String.valueOf(value), comma);
     }
 
+    public static void printField(PrintWriter pw, String name, boolean value, boolean comma) {
+        printFieldInternal(pw, name, String.valueOf(value), comma);
+    }
+
     protected static void printFieldInternal(PrintWriter pw, String name, String value, boolean comma) {
         pw.print("\t\"");
         pw.print(name);
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/result/ExecutionError.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/result/ExecutionError.java
index 6556b61..a25c5a2 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/result/ExecutionError.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/result/ExecutionError.java
@@ -52,4 +52,9 @@
     public String getMessage() {
         return message;
     }
+
+    @Override
+    public boolean isRetriable() {
+        return false;
+    }
 }
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/result/ExecutionWarning.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/result/ExecutionWarning.java
index 5552bb8..66b8f0e 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/result/ExecutionWarning.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/result/ExecutionWarning.java
@@ -44,4 +44,9 @@
     public String getMessage() {
         return message;
     }
+
+    @Override
+    public boolean isRetriable() {
+        return false;
+    }
 }
diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/result/fields/AbstractCodedMessagePrinter.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/result/fields/AbstractCodedMessagePrinter.java
index f1eb315..bbeb81c 100644
--- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/result/fields/AbstractCodedMessagePrinter.java
+++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/result/fields/AbstractCodedMessagePrinter.java
@@ -33,7 +33,8 @@
 
     private enum CodedMessageField {
         CODE("code"),
-        MSG("msg");
+        MSG("msg"),
+        RETRIABLE("retriable");
 
         private final String str;
 
@@ -62,7 +63,9 @@
             pw.print("{ \n\t");
             ResultUtil.printField(pw, CodedMessageField.CODE.str(), codedMessage.getCode());
             pw.print("\t");
-            ResultUtil.printField(pw, CodedMessageField.MSG.str(), JSONUtil.escape(codedMessage.getMessage()), false);
+            ResultUtil.printField(pw, CodedMessageField.MSG.str(), JSONUtil.escape(codedMessage.getMessage()));
+            pw.print("\t");
+            ResultUtil.printField(pw, CodedMessageField.RETRIABLE.str(), codedMessage.isRetriable(), false);
             pw.print("\t} \n\t");
             boolean lastMsg = i == messages.size() - 1;
             if (!lastMsg) {
@@ -78,6 +81,7 @@
             ObjectNode error = array.addObject();
             error.put(CodedMessageField.CODE.str(), codedMessage.getCode());
             error.put(CodedMessageField.MSG.str(), codedMessage.getMessage());
+            error.put(CodedMessageField.RETRIABLE.str(), codedMessage.isRetriable());
         });
         return objectNode;
     }
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/api/request-param-validation-400-BAD/request-param-validation-400-BAD.01.regexjson b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/request-param-validation-400-BAD/request-param-validation-400-BAD.01.regexjson
index ba3c970..f823ff8 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/results/api/request-param-validation-400-BAD/request-param-validation-400-BAD.01.regexjson
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/api/request-param-validation-400-BAD/request-param-validation-400-BAD.01.regexjson
@@ -1,6 +1,6 @@
 {
 	"errors": [{ 
-		"code": 1,		"msg": "ASX0047: Invalid value for parameter 'format': foo"	}
+		"code": 1,		"msg": "ASX0047: Invalid value for parameter 'format': foo",		"retriable": false	}
 	],
 	"status": "fatal",
 	"metrics": {
diff --git a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/ICodedMessage.java b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/ICodedMessage.java
index 06202c4..e2397aa 100644
--- a/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/ICodedMessage.java
+++ b/asterixdb/asterix-common/src/main/java/org/apache/asterix/common/api/ICodedMessage.java
@@ -33,4 +33,6 @@
      * @return the message
      */
     String getMessage();
+
+    boolean isRetriable();
 }