Files
doris/be/src/exprs/json_functions.h
Mingyu Chen 722a9e71c7 Optimize json functions (#1177)
1. get_json_xxx() now support using quoto to escape dot
2. Implement json_path_prepare() function to preprocess json_path

Performance of get_json_string() on 1000000 rows reduces from 2.27s to 0.27s
2019-05-21 09:13:12 +08:00

84 lines
2.7 KiB
C++

// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
#ifndef DORIS_BE_SRC_QUERY_EXPRS_JSON_FUNCTIONS_H
#define DORIS_BE_SRC_QUERY_EXPRS_JSON_FUNCTIONS_H
#include <rapidjson/document.h>
#include "runtime/string_value.h"
namespace doris {
enum JsonFunctionType {
JSON_FUN_INT = 0, JSON_FUN_DOUBLE, JSON_FUN_STRING
};
class Expr;
class OpcodeRegistry;
class TupleRow;
struct JsonPath {
std::string key; // key of a json object
int idx; // array index of a json array, -1 means not set
bool is_valid; // true if the path is successfully parsed
JsonPath(const std::string& key_, int idx_, bool is_valid_):
key(key_),
idx(idx_),
is_valid(is_valid_) {}
std::string debug_string() {
std::stringstream ss;
ss << "key: " << key << ", idx: " << idx << ", valid: " << is_valid;
return ss.str();
}
};
class JsonFunctions {
public:
static void init();
static doris_udf::IntVal get_json_int(
doris_udf::FunctionContext* context, const doris_udf::StringVal& json_str,
const doris_udf::StringVal& path);
static doris_udf::StringVal get_json_string(
doris_udf::FunctionContext* context, const doris_udf::StringVal& json_str,
const doris_udf::StringVal& path);
static doris_udf::DoubleVal get_json_double(
doris_udf::FunctionContext* context, const doris_udf::StringVal& json_str,
const doris_udf::StringVal& path);
static rapidjson::Value* get_json_object(
FunctionContext* context,
const std::string& json_string, const std::string& path_string,
const JsonFunctionType& fntype, rapidjson::Document* document);
static void json_path_prepare(
doris_udf::FunctionContext*,
doris_udf::FunctionContext::FunctionStateScope);
static void json_path_close(
doris_udf::FunctionContext*,
doris_udf::FunctionContext::FunctionStateScope);
private:
static void get_parsed_paths(
const std::vector<std::string>& path_exprs,
std::vector<JsonPath>* parsed_paths);
};
}
#endif