This is an automated email from the ASF dual-hosted git repository.

morningman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-doris.git


The following commit(s) were added to refs/heads/master by this push:
     new e76f712  [Bug] Load data is error in json load
e76f712 is described below

commit e76f712bb353dc8f9b5c1f893b567048abda8ded
Author: worker24h <xxbzj...@163.com>
AuthorDate: Thu May 28 17:28:33 2020 +0800

    [Bug] Load data is error in json load
---
 be/src/exec/json_scanner.cpp         | 12 ++++--------
 be/src/exprs/json_functions.cpp      |  9 ++++++++-
 be/src/exprs/json_functions.h        |  3 ++-
 be/test/exprs/json_function_test.cpp | 10 +++++-----
 4 files changed, 19 insertions(+), 15 deletions(-)

diff --git a/be/src/exec/json_scanner.cpp b/be/src/exec/json_scanner.cpp
index 1a36591..89fdeef 100644
--- a/be/src/exec/json_scanner.cpp
+++ b/be/src/exec/json_scanner.cpp
@@ -267,15 +267,11 @@ size_t JsonReader::get_data_by_jsonpath(const 
std::vector<SlotDescriptor*>& slot
         }
 
         // if jsonValues is null, because not match in jsondata.
-        rapidjson::Value* json_values = 
JsonFunctions::get_json_object_from_parsed_json(path.GetString(), &_json_doc, 
_json_doc.GetAllocator());
+        rapidjson::Value* json_values = 
JsonFunctions::get_json_array_from_parsed_json(path.GetString(), &_json_doc, 
_json_doc.GetAllocator());
         if (json_values == nullptr) {
             return -1;
         }
-        if (json_values->IsArray()) {
-            max_lines = std::max(max_lines, (size_t)json_values->Size());
-        } else {
-            max_lines = std::max(max_lines, (size_t)1);
-        }
+        max_lines = std::max(max_lines, (size_t)json_values->Size());
         _jmap.emplace(slot_descs[i]->col_name(), json_values);
     }
 
@@ -376,7 +372,7 @@ Status JsonReader::set_tuple_value(rapidjson::Value& 
objectValue, Tuple* tuple,
 /**
  * handle input a simple json
  * For example:
- *  case 1. {"RECORDS": [{"colunm1":"value1", "colunm2":10}, 
{"colunm1":"value2", "colunm2":30}]}
+ *  case 1. [{"colunm1":"value1", "colunm2":10}, {"colunm1":"value2", 
"colunm2":30}]
  *  case 2. {"colunm1":"value1", "colunm2":10}
  */
 Status JsonReader::handle_simple_json(Tuple* tuple, const 
std::vector<SlotDescriptor*>& slot_descs, MemPool* tuple_pool, bool* eof) {
@@ -497,7 +493,7 @@ Status JsonReader::handle_flat_array_complex_json(Tuple* 
tuple, const std::vecto
             }
 
             // if jsonValues is null, because not match in jsondata.
-            rapidjson::Value* json_values = 
JsonFunctions::get_json_object_from_parsed_json(path.GetString(), &objectValue, 
_json_doc.GetAllocator());
+            rapidjson::Value* json_values = 
JsonFunctions::get_json_array_from_parsed_json(path.GetString(), &objectValue, 
_json_doc.GetAllocator());
             if (json_values == nullptr) {
                 if (slot_descs[i]->is_nullable()) {
                     tuple->set_null(slot_descs[i]->null_indicator_offset());
diff --git a/be/src/exprs/json_functions.cpp b/be/src/exprs/json_functions.cpp
index 90842fb..e7252e4 100644
--- a/be/src/exprs/json_functions.cpp
+++ b/be/src/exprs/json_functions.cpp
@@ -263,7 +263,7 @@ rapidjson::Value* JsonFunctions::get_json_object(
 }
 
 
-rapidjson::Value* JsonFunctions::get_json_object_from_parsed_json (
+rapidjson::Value* JsonFunctions::get_json_array_from_parsed_json (
         const std::string& path_string,
         rapidjson::Value* document,
         rapidjson::Document::AllocatorType& mem_allocator) {
@@ -293,6 +293,13 @@ rapidjson::Value* 
JsonFunctions::get_json_object_from_parsed_json (
     rapidjson::Value* root = match_value(parsed_paths, document, 
mem_allocator, true);
     if (root == document) {// not found
         return nullptr;
+    } else if (!root->IsArray()) {
+        rapidjson::Value* array_obj = nullptr;
+        array_obj = static_cast<rapidjson::Value*>(
+                mem_allocator.Malloc(sizeof(rapidjson::Value)));
+        array_obj->SetArray();
+        array_obj->PushBack(*root, mem_allocator);
+        return array_obj;
     }
     return root;
 }
diff --git a/be/src/exprs/json_functions.h b/be/src/exprs/json_functions.h
index 24513b2..2d7a53c 100644
--- a/be/src/exprs/json_functions.h
+++ b/be/src/exprs/json_functions.h
@@ -72,8 +72,9 @@ public:
 
     /**
      * The `document` parameter must be has parsed.
+     * return Value Is Array object
      */
-    static rapidjson::Value* get_json_object_from_parsed_json(
+    static rapidjson::Value* get_json_array_from_parsed_json(
             const std::string& path_string,
             rapidjson::Value* document,
             rapidjson::Document::AllocatorType& mem_allocator);
diff --git a/be/test/exprs/json_function_test.cpp 
b/be/test/exprs/json_function_test.cpp
index 6595b22..95598df 100644
--- a/be/test/exprs/json_function_test.cpp
+++ b/be/test/exprs/json_function_test.cpp
@@ -194,13 +194,13 @@ TEST_F(JsonFunctionTest, json_path1)
         ASSERT_TRUE(false);
     }
     rapidjson::Value* res3;
-    res3 = JsonFunctions::get_json_object_from_parsed_json("$.[*].keyname.ip", 
&jsonDoc, jsonDoc.GetAllocator());
+    res3 = JsonFunctions::get_json_array_from_parsed_json("$.[*].keyname.ip", 
&jsonDoc, jsonDoc.GetAllocator());
     ASSERT_TRUE(res3->IsArray());
     for (int i = 0; i < res3->Size(); i++) {
         std::cout<< (*res3)[i].GetString() << std::endl;
     }
 
-    res3 = JsonFunctions::get_json_object_from_parsed_json("$.[*].k1", 
&jsonDoc, jsonDoc.GetAllocator());
+    res3 = JsonFunctions::get_json_array_from_parsed_json("$.[*].k1", 
&jsonDoc, jsonDoc.GetAllocator());
     ASSERT_TRUE(res3->IsArray());
     for (int i = 0; i < res3->Size(); i++) {
         std::cout<< (*res3)[i].GetString() << std::endl;
@@ -216,7 +216,7 @@ TEST_F(JsonFunctionTest, json_path_get_nullobject)
         ASSERT_TRUE(false);
     }
 
-    rapidjson::Value* res3 = 
JsonFunctions::get_json_object_from_parsed_json("$.[*].b", &jsonDoc, 
jsonDoc.GetAllocator());
+    rapidjson::Value* res3 = 
JsonFunctions::get_json_array_from_parsed_json("$.[*].b", &jsonDoc, 
jsonDoc.GetAllocator());
     ASSERT_TRUE(res3->IsArray());
     ASSERT_EQ(res3->Size(), 3);
     for (int i = 0; i < res3->Size(); i++) {
@@ -239,7 +239,7 @@ TEST_F(JsonFunctionTest, json_path_test)
             ASSERT_TRUE(false);
         }
 
-        rapidjson::Value* res3 = 
JsonFunctions::get_json_object_from_parsed_json("$.[*].a", &jsonDoc, 
jsonDoc.GetAllocator());
+        rapidjson::Value* res3 = 
JsonFunctions::get_json_array_from_parsed_json("$.[*].a", &jsonDoc, 
jsonDoc.GetAllocator());
         ASSERT_TRUE(res3->IsArray());
         ASSERT_EQ(res3->Size(), 2);
         for (int i = 0; i < res3->Size(); i++) {
@@ -258,7 +258,7 @@ TEST_F(JsonFunctionTest, json_path_test)
             ASSERT_TRUE(false);
         }
 
-        rapidjson::Value* res3 = 
JsonFunctions::get_json_object_from_parsed_json("$.a", &jsonDoc, 
jsonDoc.GetAllocator());
+        rapidjson::Value* res3 = 
JsonFunctions::get_json_array_from_parsed_json("$.a", &jsonDoc, 
jsonDoc.GetAllocator());
         ASSERT_TRUE(res3->IsArray());
         ASSERT_EQ(res3->Size(), 2);
         for (int i = 0; i < res3->Size(); i++) {


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to