This is an automated email from the ASF dual-hosted git repository. alsuliman pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/asterixdb.git
commit 975daeab1ce7eb1d9af2ae3e2c1bdc3b437a7356 Author: Ali Alsuliman <[email protected]> AuthorDate: Fri Feb 24 18:35:08 2023 -0800 [NO ISSUE][FUN] DUMP_INDEX, handle complex types when constructing JSON - user model changes: no - storage format changes: no - interface changes: no Change-Id: I0d5e4aa8bf886c10d547215291e65ba74c03f5ba Reviewed-on: https://asterix-gerrit.ics.uci.edu/c/asterixdb/+/17398 Integration-Tests: Jenkins <[email protected]> Tested-by: Jenkins <[email protected]> Reviewed-by: Murtadha Hubail <[email protected]> --- .../asterix/app/function/DumpIndexReader.java | 59 +++++++++++++++++++--- .../misc/dump_index/dump_index.1.ddl.sqlpp | 6 ++- ...ex.2.update.sqlpp => dump_index.10.query.sqlpp} | 3 +- .../misc/dump_index/dump_index.2.update.sqlpp | 4 +- .../results/misc/dump_index/dump_index.10.adm | 1 + 5 files changed, 62 insertions(+), 11 deletions(-) diff --git a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/DumpIndexReader.java b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/DumpIndexReader.java index aed15c6215..e60b015b06 100644 --- a/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/DumpIndexReader.java +++ b/asterixdb/asterix-app/src/main/java/org/apache/asterix/app/function/DumpIndexReader.java @@ -24,7 +24,11 @@ import java.nio.ByteBuffer; import org.apache.asterix.external.api.IRawRecord; import org.apache.asterix.external.input.record.CharArrayRecord; +import org.apache.asterix.om.base.ARecord; +import org.apache.asterix.om.base.IACollection; +import org.apache.asterix.om.base.IACursor; import org.apache.asterix.om.base.IAObject; +import org.apache.asterix.om.types.ARecordType; import org.apache.asterix.om.types.ATypeTag; import org.apache.hyracks.api.dataflow.value.IBinaryComparatorFactory; import org.apache.hyracks.api.dataflow.value.RecordDescriptor; @@ -106,25 +110,64 @@ public class DumpIndexReader extends FunctionReader { if (tag == ATypeTag.MISSING) { continue; } - if (isTemporal(tag)) { - JSONUtil.quoteAndEscape(recordBuilder, field.toString()); - } else { - recordBuilder.append(field); - } + printField(recordBuilder, field); recordBuilder.append(","); } recordBuilder.deleteCharAt(recordBuilder.length() - 1); recordBuilder.append("]}"); } - private static boolean isTemporal(ATypeTag typeTag) { + private void printField(StringBuilder sb, IAObject field) { + ATypeTag typeTag = field.getType().getTypeTag(); switch (typeTag) { + case OBJECT: + printObject(sb, ((ARecord) field)); + break; + case ARRAY: + case MULTISET: + printCollection(sb, ((IACollection) field)); + break; case DATE: case TIME: case DATETIME: - return true; + JSONUtil.quoteAndEscape(recordBuilder, field.toString()); + break; + case MISSING: + break; default: - return false; + sb.append(field); + } + } + + private void printObject(StringBuilder sb, ARecord record) { + sb.append("{ "); + int num = record.numberOfFields(); + ARecordType type = record.getType(); + for (int i = 0; i < num; i++) { + if (i > 0) { + sb.append(", "); + } + IAObject value = record.getValueByPos(i); + JSONUtil.quoteAndEscape(sb, type.getFieldNames()[i]); + sb.append(": "); + printField(sb, value); + } + sb.append(" }"); + } + + private void printCollection(StringBuilder sb, IACollection collection) { + IACursor cursor = collection.getCursor(); + sb.append("[ "); + boolean first = true; + while (cursor.next()) { + IAObject element = cursor.get(); + if (first) { + first = false; + } else { + sb.append(", "); + } + printField(sb, element); } + sb.append(" ]"); } } diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/dump_index/dump_index.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/dump_index/dump_index.1.ddl.sqlpp index 2e97872399..00de4a4808 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/dump_index/dump_index.1.ddl.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/dump_index/dump_index.1.ddl.sqlpp @@ -20,5 +20,9 @@ DROP DATAVERSE test IF EXISTS; CREATE DATAVERSE test; USE test; CREATE TYPE t1 AS {id:int, name:string?}; +CREATE TYPE t2 AS {id:int}; + CREATE DATASET ds(t1) PRIMARY KEY id; -CREATE INDEX name_idx ON ds(name); \ No newline at end of file +CREATE INDEX name_idx ON ds(name); + +CREATE DATASET ds2(t2) PRIMARY KEY id; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/dump_index/dump_index.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/dump_index/dump_index.10.query.sqlpp similarity index 89% copy from asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/dump_index/dump_index.2.update.sqlpp copy to asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/dump_index/dump_index.10.query.sqlpp index 21ce2b6f3e..0c228fc736 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/dump_index/dump_index.2.update.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/dump_index/dump_index.10.query.sqlpp @@ -16,5 +16,6 @@ * specific language governing permissions and limitations * under the License. */ +SET `import-private-functions` `true`; USE test; -INSERT INTO ds ([{"id":1, "name": "name1"}, {"id":2, "name": "name2"}]); \ No newline at end of file +SELECT VALUE DUMP_INDEX("test", "ds2", "sample_idx_1_ds2"); \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/dump_index/dump_index.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/dump_index/dump_index.2.update.sqlpp index 21ce2b6f3e..10378f2d82 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/dump_index/dump_index.2.update.sqlpp +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/misc/dump_index/dump_index.2.update.sqlpp @@ -17,4 +17,6 @@ * under the License. */ USE test; -INSERT INTO ds ([{"id":1, "name": "name1"}, {"id":2, "name": "name2"}]); \ No newline at end of file +INSERT INTO ds ([{"id":1, "name": "name1"}, {"id":2, "name": "name2"}]); +UPSERT INTO ds2 ([{"id": 1,"age":30, "a1": {"b": [{"x": [1,2]}, {"x": [1,2]}]}, "a2": [{"x": [1,2]}, {"x": [1,2]}] }]); +ANALYZE DATASET ds2; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/dump_index/dump_index.10.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/dump_index/dump_index.10.adm new file mode 100644 index 0000000000..a52ceaeb97 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/misc/dump_index/dump_index.10.adm @@ -0,0 +1 @@ +[ { "values": [ 1, { "id": 1, "age": 30, "a1": { "b": [ { "x": [ 1, 2 ] }, { "x": [ 1, 2 ] } ] }, "a2": [ { "x": [ 1, 2 ] }, { "x": [ 1, 2 ] } ] } ] } ] \ No newline at end of file
