/** * Copyright (c) 2021 OceanBase * OceanBase CE is licensed under Mulan PubL v2. * You can use this software according to the terms and conditions of the Mulan PubL v2. * You may obtain a copy of Mulan PubL v2 at: * http://license.coscl.org.cn/MulanPubL-2.0 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. * See the Mulan PubL v2 for more details. * This file contains interface support for the binary aggregate test. */ #include #define private public #include "lib/json_type/ob_json_tree.h" #include "lib/json_type/ob_json_bin.h" #include "lib/json_type/ob_json_parse.h" #include "lib/xml/ob_multi_mode_bin.h" #include "lib/xml/ob_xml_bin.h" #include "lib/xml/ob_tree_base.h" #include "lib/xml/ob_mul_mode_reader.h" #include "lib/xml/ob_xml_tree.h" #include "lib/timezone/ob_timezone_info.h" #include "lib/xml/ob_xml_parser.h" #include "lib/xml/ob_xml_util.h" #include "lib/xml/ob_binary_aggregate.h" #undef private #include #include using namespace std; namespace oceanbase { namespace common{ class TestBinaryAgg : public ::testing::Test { public: TestBinaryAgg() {} ~TestBinaryAgg() {} virtual void SetUp() {} virtual void TearDown() {} static void SetUpTestCase() {} static void TearDownTestCase() {} private: // disallow copy DISALLOW_COPY_AND_ASSIGN(TestBinaryAgg); }; static void get_xml_document_1(ObMulModeMemCtx* ctx, ObXmlDocument*& handle) { int ret = 0; common::ObString xml_text( "\n" " John Smith\n" " \n" " Ola Nordmann\n" "
Langgt 23
\n" " 4000 Stavanger\n" " Norway\n" "
\n" "
\n" ); ObXmlDocument* doc = nullptr; ret = ObXmlParserUtils::parse_document_text(ctx, xml_text, doc); ASSERT_EQ(OB_SUCCESS, ret); handle = doc; } static void get_xml_document_2(ObMulModeMemCtx* ctx, ObXmlDocument*& handle) { int ret = 0; common::ObString xml_text( "\n" " John Smith\n" "\n" ); ObXmlDocument* doc = nullptr; ret = ObXmlParserUtils::parse_document_text(ctx, xml_text, doc); ASSERT_EQ(OB_SUCCESS, ret); handle = doc; } #define PREDICATE_TEST_COUNT 20 ObString xml_text_array[PREDICATE_TEST_COUNT] = { // 0 "\n" " John Smith\n" "\n", // 1 "\n" " carrot1 Smith\n" " carrot2 Smith\n" "\n", // 2 "Everyday Italian", // 3 "29.99", // 4 "", // 5 "200530.00", // 6 "abcd", // 7 "a tree_array; get_xml_document_1(ctx, doc1); ASSERT_EQ(OB_SUCCESS, ret); tree_array.push_back(doc1); get_xml_document_2(ctx, doc2); ASSERT_EQ(OB_SUCCESS, ret); tree_array.push_back(doc2); ObBinAggSerializer bin_agg(ctx->allocator_, ObBinAggType::AGG_XML, static_cast(M_CONTENT)); { for (int i = 0; i < tree_array.count(); i++) { ObXmlBin bin(ctx); ObIMulModeBase* tree = tree_array.at(i); ASSERT_EQ(bin.parse_tree(tree), OB_SUCCESS); ASSERT_EQ(bin_agg.append_key_and_value(&bin), OB_SUCCESS); } ASSERT_EQ(bin_agg.serialize(), OB_SUCCESS); ObIMulModeBase *base; ObStringBuffer *buffer = bin_agg.get_buffer(); ASSERT_EQ(ObMulModeFactory::get_xml_base(ctx, buffer->string(), ObNodeMemType::BINARY_TYPE, ObNodeMemType::TREE_TYPE, base), OB_SUCCESS); ObStringBuffer str_buf(ctx->allocator_); base->print_document(str_buf, CS_TYPE_UTF8MB4_GENERAL_CI, 0, 0); ASSERT_EQ(str_buf.string(), "John SmithOla Nordmann
Langgt 23
4000 StavangerNorway
John Smith"); cout << str_buf.ptr() << endl; } } #define TEST_ROW_COUNT 10000 static void get_multi_node_document(ObMulModeMemCtx* ctx, ObXmlDocument*& handle) { int ret = 0; // common::ObString xml_text( // "book0Everydaycarrot202399.99 book1Everydaycarrot202399.99 book2Everydaycarrot202399.99 book3Everydaycarrot202399.99 book4Everydaycarrot202399.99 book5Everydaycarrot202399.99 book6Everydaycarrot202399.99 book7Everydaycarrot202399.99 book8Everydaycarrot202399.99 book9Everyday" // ); common::ObString xml_text( "tagi_value" ); ObXmlDocument* doc = nullptr; ret = ObXmlParserUtils::parse_document_text(ctx, xml_text, doc); ASSERT_EQ(OB_SUCCESS, ret); handle = doc; } TEST_F(TestBinaryAgg, xmlagg_performance_test) { int ret = 0; ObArenaAllocator allocator(ObModIds::TEST); ObXmlDocument* doc = nullptr; ObMulModeMemCtx* ctx = nullptr; ASSERT_EQ(ObXmlUtil::create_mulmode_tree_context(&allocator, ctx), OB_SUCCESS); get_multi_node_document(ctx, doc); ASSERT_EQ(OB_SUCCESS, ret); ObXmlBin bin(ctx); ASSERT_EQ(bin.parse_tree(doc), OB_SUCCESS); std::chrono::milliseconds ms_start = std::chrono::duration_cast< std::chrono::milliseconds >( std::chrono::system_clock::now().time_since_epoch()); int start_time = ms_start.count(); cout << start_time << endl; ObBinAggSerializer bin_agg(ctx->allocator_, ObBinAggType::AGG_XML, static_cast(M_CONTENT)); for (int i = 0; i < TEST_ROW_COUNT; i++) { ASSERT_EQ(bin_agg.append_key_and_value(&bin), OB_SUCCESS); } ASSERT_EQ(bin_agg.serialize(), OB_SUCCESS); std::chrono::milliseconds ms_end = std::chrono::duration_cast< std::chrono::milliseconds >( std::chrono::system_clock::now().time_since_epoch()); int end_time = ms_end.count(); cout << end_time << endl; cout << "total used: " << end_time - start_time << endl; } TEST_F(TestBinaryAgg, xmlagg_tree_test) { int ret = 0; ObArenaAllocator allocator(ObModIds::TEST); ObXmlDocument* doc = nullptr; ObMulModeMemCtx* ctx = nullptr; ASSERT_EQ(ObXmlUtil::create_mulmode_tree_context(&allocator, ctx), OB_SUCCESS); get_multi_node_document(ctx, doc); ASSERT_EQ(OB_SUCCESS, ret); ObXmlBin bin(ctx); ASSERT_EQ(bin.parse_tree(doc), OB_SUCCESS); ObString input_str; ASSERT_EQ(OB_SUCCESS, doc->get_raw_binary(input_str, ctx->allocator_)); std::chrono::milliseconds ms_start = std::chrono::duration_cast< std::chrono::milliseconds >( std::chrono::system_clock::now().time_since_epoch()); int start_time = ms_start.count(); cout << start_time << endl; ObXmlDocument *content = NULL; content = OB_NEWx(ObXmlDocument, ctx->allocator_, ObMulModeNodeType::M_CONTENT, ctx); ASSERT_EQ(OB_SUCCESS, content->alter_member_sort_policy(false)); for (int i = 0; i < TEST_ROW_COUNT; i++) { ObIMulModeBase *base; ASSERT_EQ(OB_SUCCESS, ObMulModeFactory::get_xml_base(ctx, input_str, ObNodeMemType::BINARY_TYPE, ObNodeMemType::TREE_TYPE, base)); ObXmlDocument *input_doc = static_cast(base); ASSERT_EQ(OB_SUCCESS, content->add_element(input_doc->at(0))); } ObString binary_str; ASSERT_EQ(OB_SUCCESS, content->get_raw_binary(binary_str, ctx->allocator_)); std::chrono::milliseconds ms_end = std::chrono::duration_cast< std::chrono::milliseconds >( std::chrono::system_clock::now().time_since_epoch()); int end_time = ms_end.count(); cout << end_time << endl; cout << "total used: " << end_time - start_time << endl; } TEST_F(TestBinaryAgg, mulit_bin) { int ret = 0; ObArenaAllocator allocator(ObModIds::TEST); ObMulModeMemCtx* ctx = nullptr; ASSERT_EQ(ObXmlUtil::create_mulmode_tree_context(&allocator, ctx), OB_SUCCESS); ObArray tree_array; for (int i = 0; i < 5; i++) { ObXmlDocument* doc = nullptr; get_xml_document(ctx, doc, i); ASSERT_EQ(OB_SUCCESS, ret); tree_array.push_back(doc); } { cout << "TEST CASE: 1" << endl; ObBinAggSerializer bin_agg(ctx->allocator_, ObBinAggType::AGG_XML, static_cast(M_CONTENT), true); for (int i = 0; i < 5; i++) { ObXmlBin bin(ctx); ObIMulModeBase* tree = tree_array.at(i); cout << "Add XML: " << i << endl; ASSERT_EQ(bin.parse_tree(tree), OB_SUCCESS); ASSERT_EQ(bin_agg.append_key_and_value(&bin), OB_SUCCESS); } ASSERT_EQ(bin_agg.serialize(), OB_SUCCESS); ObIMulModeBase *base; ObStringBuffer *buffer = bin_agg.get_buffer(); ASSERT_EQ(ObMulModeFactory::get_xml_base(ctx, buffer->string(), ObNodeMemType::BINARY_TYPE, ObNodeMemType::TREE_TYPE, base), OB_SUCCESS); ObStringBuffer str_buf(ctx->allocator_); ParamPrint param_list; base->print_content(str_buf, false, false, 0, param_list); ASSERT_EQ(str_buf.string(), "John Smithcarrot1 Smithcarrot2 SmithEveryday Italian29.99"); cout << str_buf.ptr() << endl; } { cout << "TEST CASE: 2" << endl; ObBinAggSerializer bin_agg(ctx->allocator_, ObBinAggType::AGG_XML, static_cast(M_CONTENT), true); int doc_array[5] = {0, 2, 4, 5, 6}; for (int i = 0; i < 5; i++) { cout << "Add XML: " << i << endl; ObIMulModeBase *input_base; ASSERT_EQ(ObMulModeFactory::get_xml_base(ctx, xml_text_array[doc_array[i]], ObNodeMemType::TREE_TYPE, ObNodeMemType::BINARY_TYPE, input_base, xml_test_type[doc_array[i]]), OB_SUCCESS); ObXmlBin *bin = static_cast(input_base); ASSERT_EQ(bin_agg.append_key_and_value(bin), OB_SUCCESS); } ASSERT_EQ(bin_agg.serialize(), OB_SUCCESS); ObIMulModeBase *base; ObStringBuffer *buffer = bin_agg.get_buffer(); ASSERT_EQ(ObMulModeFactory::get_xml_base(ctx, buffer->string(), ObNodeMemType::BINARY_TYPE, ObNodeMemType::TREE_TYPE, base), OB_SUCCESS); ObStringBuffer str_buf(ctx->allocator_); ParamPrint param_list; base->print_content(str_buf, false, false, 0, param_list); ASSERT_EQ(str_buf.string(), "John SmithEveryday Italian200530.00abcd"); cout << str_buf.ptr() << endl; } { cout << "TEST CASE: 3" << endl; ObBinAggSerializer bin_agg(ctx->allocator_, ObBinAggType::AGG_XML, static_cast(M_CONTENT), true); int doc_array[2] = {7, 8}; for (int i = 0; i < 2; i++) { cout << "Add XML: " << i << endl; ObIMulModeBase *input_base; ASSERT_EQ(ObMulModeFactory::get_xml_base(ctx, xml_text_array[doc_array[i]], ObNodeMemType::TREE_TYPE, ObNodeMemType::BINARY_TYPE, input_base, xml_test_type[doc_array[i]]), OB_SUCCESS); ObXmlBin *bin = static_cast(input_base); ASSERT_EQ(bin_agg.append_key_and_value(bin), OB_SUCCESS); } ASSERT_EQ(bin_agg.serialize(), OB_SUCCESS); ObIMulModeBase *base; ObStringBuffer *buffer = bin_agg.get_buffer(); ASSERT_EQ(ObMulModeFactory::get_xml_base(ctx, buffer->string(), ObNodeMemType::BINARY_TYPE, ObNodeMemType::TREE_TYPE, base), OB_SUCCESS); ObStringBuffer str_buf(ctx->allocator_); ParamPrint param_list; base->print_content(str_buf, false, false, 0, param_list); ASSERT_EQ(str_buf.string(), "aallocator_, ObBinAggType::AGG_XML, static_cast(M_CONTENT), true); int doc_array[5] = {7, 6, 8, 9, 5}; for (int i = 0; i < 5; i++) { cout << "Add XML: " << i << endl; ObIMulModeBase *input_base; ASSERT_EQ(ObMulModeFactory::get_xml_base(ctx, xml_text_array[doc_array[i]], ObNodeMemType::TREE_TYPE, ObNodeMemType::BINARY_TYPE, input_base, xml_test_type[doc_array[i]]), OB_SUCCESS); ObXmlBin *bin = static_cast(input_base); ASSERT_EQ(bin_agg.append_key_and_value(bin), OB_SUCCESS); } ASSERT_EQ(bin_agg.serialize(), OB_SUCCESS); ObIMulModeBase *base; ObStringBuffer *buffer = bin_agg.get_buffer(); ASSERT_EQ(ObMulModeFactory::get_xml_base(ctx, buffer->string(), ObNodeMemType::BINARY_TYPE, ObNodeMemType::TREE_TYPE, base), OB_SUCCESS); ObStringBuffer str_buf(ctx->allocator_); ParamPrint param_list; base->print_content(str_buf, false, false, 0, param_list); ASSERT_EQ(str_buf.string(), "a
abcd200530.00"); cout << str_buf.ptr() << endl; } { cout << "TEST CASE: 5" << endl; ObBinAggSerializer bin_agg(ctx->allocator_, ObBinAggType::AGG_XML, static_cast(M_CONTENT), true); int doc_array[12] = {0, 7, 8, 1, 2, 3, 9, 4, 5, 6, 10, 11}; for (int i = 0; i < 12; i++) { cout << "Add XML: " << i << endl; ObIMulModeBase *input_base; ASSERT_EQ(ObMulModeFactory::get_xml_base(ctx, xml_text_array[doc_array[i]], ObNodeMemType::TREE_TYPE, ObNodeMemType::BINARY_TYPE, input_base, xml_test_type[doc_array[i]]), OB_SUCCESS); ObXmlBin *bin = static_cast(input_base); ASSERT_EQ(bin_agg.append_key_and_value(bin), OB_SUCCESS); } ASSERT_EQ(bin_agg.serialize(), OB_SUCCESS); ObIMulModeBase *base; ObStringBuffer *buffer = bin_agg.get_buffer(); ASSERT_EQ(ObMulModeFactory::get_xml_base(ctx, buffer->string(), ObNodeMemType::BINARY_TYPE, ObNodeMemType::TREE_TYPE, base), OB_SUCCESS); ObStringBuffer str_buf(ctx->allocator_); ParamPrint param_list; base->print_content(str_buf, false, false, 0, param_list); ASSERT_EQ(str_buf.string(), "John Smithacarrot1 Smithcarrot2 SmithEveryday Italian29.99
200530.00abcdxyzcarrot"); cout << str_buf.ptr() << endl; } } ObString json_text_array[PREDICATE_TEST_COUNT] = { "{\"a\":100, \"b\":200, \"c\":300}", // 0 "{ \"item\" : \"canvas\"}", // 1 "{\"c\":2, \"a\":0, \"b\":1}", // 2 "\"not object\"", // 3 "\"123\"", // 4 "333", // 5 "[\"book\", \"read\"]", // 6 }; ObString json_key_array[PREDICATE_TEST_COUNT] = { "abcd", // 0 "efg", // 1 "carrot", // 2 "newkey", // 3 "xyz", // 4 "yxz", // 5 "", // 6 }; TEST_F(TestBinaryAgg, json_agg) { int ret = 0; ObArenaAllocator allocator(ObModIds::TEST); ObMulModeMemCtx* ctx = nullptr; ASSERT_EQ(ObXmlUtil::create_mulmode_tree_context(&allocator, ctx), OB_SUCCESS); { cout << "TEST JSON CASE: 1" << endl; ObBinAggSerializer bin_agg(&allocator, ObBinAggType::AGG_JSON, static_cast(ObJsonNodeType::J_OBJECT)); ObStringBuffer value(&allocator); int json_array[2] = {0, 1}; for (int i = 0; i < 2; i++) { cout << "Add JSON: " << i << endl; ObIJsonBase *input_base = NULL; ASSERT_EQ(ObJsonBaseFactory::get_json_base(&allocator, json_text_array[json_array[i]], ObJsonInType::JSON_TREE, ObJsonInType::JSON_BIN, input_base), OB_SUCCESS); ObJsonBin *bin = static_cast(input_base); ASSERT_EQ(bin_agg.append_key_and_value(json_key_array[json_array[i]], value, bin), OB_SUCCESS); } ASSERT_EQ(bin_agg.serialize(), OB_SUCCESS); ObIJsonBase *base = NULL; ObStringBuffer *buffer = bin_agg.get_buffer(); ASSERT_EQ(ObJsonBaseFactory::get_json_base(&allocator, buffer->string(), ObJsonInType::JSON_BIN, ObJsonInType::JSON_BIN, base), OB_SUCCESS); ObJsonBuffer buf(&allocator); ASSERT_EQ(base->print(buf, true), OB_SUCCESS); cout << buf.ptr() << endl; ASSERT_EQ(buf.string(), "{\"abcd\": {\"a\": 100, \"b\": 200, \"c\": 300}, \"efg\": {\"item\": \"canvas\"}}"); } { cout << "TEST JSON CASE: 2" << endl; ObBinAggSerializer bin_agg(&allocator, ObBinAggType::AGG_JSON, static_cast(ObJsonNodeType::J_OBJECT)); int json_array[3] = {1, 2, 0}; ObStringBuffer value(&allocator); for (int i = 0; i < 3; i++) { cout << "Add JSON: " << i << endl; ObIJsonBase *input_base = NULL; ASSERT_EQ(ObJsonBaseFactory::get_json_base(&allocator, json_text_array[json_array[i]], ObJsonInType::JSON_TREE, ObJsonInType::JSON_BIN, input_base), OB_SUCCESS); ObJsonBin *bin = static_cast(input_base); ASSERT_EQ(bin_agg.append_key_and_value(json_key_array[json_array[i]], value, bin), OB_SUCCESS); } ASSERT_EQ(bin_agg.serialize(), OB_SUCCESS); ObIJsonBase *base = NULL; ObStringBuffer *buffer = bin_agg.get_buffer(); ASSERT_EQ(ObJsonBaseFactory::get_json_base(&allocator, buffer->string(), ObJsonInType::JSON_BIN, ObJsonInType::JSON_BIN, base), OB_SUCCESS); ObJsonBuffer buf(&allocator); ASSERT_EQ(base->print(buf, true), OB_SUCCESS); cout << buf.ptr() << endl; ASSERT_EQ(buf.string(), "{\"efg\": {\"item\": \"canvas\"}, \"carrot\": {\"a\": 0, \"b\": 1, \"c\": 2}, \"abcd\": {\"a\": 100, \"b\": 200, \"c\": 300}}"); } { cout << "TEST JSON CASE: 3" << endl; ObBinAggSerializer bin_agg(&allocator, ObBinAggType::AGG_JSON, static_cast(ObJsonNodeType::J_OBJECT)); int json_array[5] = {0, 1, 2, 3, 4}; ObStringBuffer value(&allocator); for (int i = 0; i < 5; i++) { cout << "Add JSON: " << i << endl; ObIJsonBase *input_base = NULL; ASSERT_EQ(ObJsonBaseFactory::get_json_base(&allocator, json_text_array[json_array[i]], ObJsonInType::JSON_TREE, ObJsonInType::JSON_BIN, input_base), OB_SUCCESS); ObJsonBin *bin = static_cast(input_base); ASSERT_EQ(bin_agg.append_key_and_value(json_key_array[json_array[i]], value, bin), OB_SUCCESS); } ASSERT_EQ(bin_agg.serialize(), OB_SUCCESS); ObIJsonBase *base = NULL; ObStringBuffer *buffer = bin_agg.get_buffer(); ASSERT_EQ(ObJsonBaseFactory::get_json_base(&allocator, buffer->string(), ObJsonInType::JSON_BIN, ObJsonInType::JSON_BIN, base), OB_SUCCESS); ObJsonBuffer buf(&allocator); ASSERT_EQ(base->print(buf, true), OB_SUCCESS); cout << buf.ptr() << endl; ASSERT_EQ(buf.string(), "{\"abcd\": {\"a\": 100, \"b\": 200, \"c\": 300}, \"efg\": {\"item\": \"canvas\"}, \"carrot\": {\"a\": 0, \"b\": 1, \"c\": 2}, \"newkey\": \"not object\", \"xyz\": \"123\"}"); } { cout << "TEST JSON CASE: 4" << endl; ObBinAggSerializer bin_agg(&allocator, ObBinAggType::AGG_JSON, static_cast(ObJsonNodeType::J_OBJECT)); int json_array[3] = {3, 5, 4}; ObStringBuffer value(&allocator); for (int i = 0; i < 3; i++) { cout << "Add JSON: " << i << endl; ObIJsonBase *input_base = NULL; ASSERT_EQ(ObJsonBaseFactory::get_json_base(&allocator, json_text_array[json_array[i]], ObJsonInType::JSON_TREE, ObJsonInType::JSON_BIN, input_base), OB_SUCCESS); ObJsonBin *bin = static_cast(input_base); ASSERT_EQ(bin_agg.append_key_and_value(json_key_array[json_array[i]], value, bin), OB_SUCCESS); } ASSERT_EQ(bin_agg.serialize(), OB_SUCCESS); ObIJsonBase *base = NULL; ObStringBuffer *buffer = bin_agg.get_buffer(); ASSERT_EQ(ObJsonBaseFactory::get_json_base(&allocator, buffer->string(), ObJsonInType::JSON_BIN, ObJsonInType::JSON_BIN, base), OB_SUCCESS); ObJsonBuffer buf(&allocator); ASSERT_EQ(base->print(buf, true), OB_SUCCESS); cout << buf.ptr() << endl; ASSERT_EQ(buf.string(), "{\"newkey\": \"not object\", \"yxz\": 333, \"xyz\": \"123\"}"); } { cout << "TEST JSON CASE: 5" << endl; ObBinAggSerializer bin_agg(&allocator, ObBinAggType::AGG_JSON, static_cast(ObJsonNodeType::J_OBJECT)); int json_array[5] = {0, 1, 4, 5, 6}; ObStringBuffer value(&allocator); for (int i = 0; i < 5; i++) { cout << "Add JSON: " << i << endl; ObIJsonBase *input_base = NULL; ASSERT_EQ(ObJsonBaseFactory::get_json_base(&allocator, json_text_array[json_array[i]], ObJsonInType::JSON_TREE, ObJsonInType::JSON_BIN, input_base), OB_SUCCESS); ObJsonBin *bin = static_cast(input_base); ASSERT_EQ(bin_agg.append_key_and_value(json_key_array[json_array[i]], value, bin), OB_SUCCESS); } ASSERT_EQ(bin_agg.serialize(), OB_SUCCESS); ObIJsonBase *base = NULL; ObStringBuffer *buffer = bin_agg.get_buffer(); ASSERT_EQ(ObJsonBaseFactory::get_json_base(&allocator, buffer->string(), ObJsonInType::JSON_BIN, ObJsonInType::JSON_BIN, base), OB_SUCCESS); ObJsonBuffer buf(&allocator); ASSERT_EQ(base->print(buf, true), OB_SUCCESS); cout << buf.ptr() << endl; ASSERT_EQ(buf.string(), "{\"abcd\": {\"a\": 100, \"b\": 200, \"c\": 300}, \"efg\": {\"item\": \"canvas\"}, \"xyz\": \"123\", \"yxz\": 333, \"\": [\"book\", \"read\"]}"); } // json_query with wrapper { cout << "TEST JSON CASE: 6" << endl; ObBinAggSerializer bin_agg(&allocator, ObBinAggType::AGG_JSON, static_cast(ObJsonNodeType::J_ARRAY)); int json_array[8] = {0, 0, 0, 6}; ObStringBuffer value(&allocator); ObString input_null; for (int i = 0; i < 4; i++) { cout << "Add JSON: " << i << endl; ObIJsonBase *input_base = NULL; ASSERT_EQ(ObJsonBaseFactory::get_json_base(&allocator, json_text_array[json_array[i]], ObJsonInType::JSON_TREE, ObJsonInType::JSON_BIN, input_base), OB_SUCCESS); ObJsonBin *bin = static_cast(input_base); ASSERT_EQ(bin_agg.append_key_and_value(input_null, value, bin), OB_SUCCESS); } ASSERT_EQ(bin_agg.serialize(), OB_SUCCESS); ObIJsonBase *base = NULL; ObStringBuffer *buffer = bin_agg.get_buffer(); ASSERT_EQ(ObJsonBaseFactory::get_json_base(&allocator, buffer->string(), ObJsonInType::JSON_BIN, ObJsonInType::JSON_BIN, base), OB_SUCCESS); ObJsonBuffer buf(&allocator); ASSERT_EQ(base->print(buf, true), OB_SUCCESS); cout << buf.ptr() << endl; //ASSERT_EQ(buf.string(), "{\"\": [\"book\", \"read\"], \"abcd\": {\"a\": 100, \"b\": 200, \"c\": 300}, \"efg\": {\"item\": \"canvas\"}, \"xyz\": \"123\", \"yxz\": 333}"); } { cout << "TEST JSON CASE: 7" << endl; ObBinAggSerializer bin_agg(&allocator, ObBinAggType::AGG_JSON, static_cast(ObJsonNodeType::J_ARRAY)); int json_array[8] = {0, 0, 0, 0, 6}; ObStringBuffer value(&allocator); ObString input_null; for (int i = 0; i < 5; i++) { cout << "Add JSON: " << i << endl; ObIJsonBase *input_base = NULL; ASSERT_EQ(ObJsonBaseFactory::get_json_base(&allocator, json_text_array[json_array[i]], ObJsonInType::JSON_TREE, ObJsonInType::JSON_BIN, input_base), OB_SUCCESS); ObJsonBin *bin = static_cast(input_base); ASSERT_EQ(bin_agg.append_key_and_value(input_null, value, bin), OB_SUCCESS); } ASSERT_EQ(bin_agg.serialize(), OB_SUCCESS); ObIJsonBase *base = NULL; ObStringBuffer *buffer = bin_agg.get_buffer(); ASSERT_EQ(ObJsonBaseFactory::get_json_base(&allocator, buffer->string(), ObJsonInType::JSON_BIN, ObJsonInType::JSON_BIN, base), OB_SUCCESS); ObJsonBuffer buf(&allocator); ASSERT_EQ(base->print(buf, true), OB_SUCCESS); cout << buf.ptr() << endl; //ASSERT_EQ(buf.string(), "{\"\": [\"book\", \"read\"], \"abcd\": {\"a\": 100, \"b\": 200, \"c\": 300}, \"efg\": {\"item\": \"canvas\"}, \"xyz\": \"123\", \"yxz\": 333}"); } } }; }; int main(int argc, char** argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }