MCPcopy Create free account
hub / github.com/bytedance/bolt / apply

Method apply

bolt/functions/prestosql/StringToMap.cpp:63–194  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

61 return false;
62 }
63 void apply(
64 const SelectivityVector& rows,
65 std::vector<VectorPtr>& args,
66 const TypePtr& /* outputType */,
67 exec::EvalCtx& context,
68 VectorPtr& result) const override {
69 BaseVector::ensureWritable(
70 rows, MAP(VARCHAR(), VARCHAR()), context.pool(), result);
71 exec::LocalDecodedVector input(context, *args[0], rows);
72 exec::VectorWriter<Map<Varchar, Varchar>> resultWriter;
73 resultWriter.init(*result->as<MapVector>());
74 rows.applyToSelected([&](vector_size_t row) {
75 resultWriter.setOffset(row);
76 if (input->isNullAt(row)) {
77 resultWriter.commitNull();
78 return;
79 }
80 auto& mapWriter = resultWriter.current();
81 auto sv = input->valueAt<StringView>(row);
82 const std::string_view current = std::string_view(sv.data(), sv.size());
83 size_t start = 0;
84 size_t end = 0;
85 // used in Policy == LAST_WIN
86 folly::F14FastMap<std::string_view, std::string_view> keyValues;
87 folly::F14FastSet<std::string_view> nulls;
88 folly::F14FastSet<std::string_view> keys;
89 auto processKeyValue = [&](std::string_view key, std::string_view value) {
90 if constexpr (Policy == EXCEPTION) {
91 BOLT_USER_CHECK(
92 keys.insert(key).second,
93 "Duplicate map key {} was found, please check the input data. If you want "
94 "to remove the duplicated keys, you can set spark.sql.mapKeyDedupPolicy to "
95 "LAST_WIN so that the key inserted at last takes precedence.",
96 key);
97 auto [keyWriter, valueWriter] = mapWriter.add_item();
98 keyWriter.setNoCopy(StringView(key));
99 valueWriter.setNoCopy(StringView(value));
100 } else if constexpr (Policy == FIRST_WIN) {
101 if (keys.insert(key).second) {
102 auto [keyWriter, valueWriter] = mapWriter.add_item();
103 keyWriter.setNoCopy(StringView(key));
104 valueWriter.setNoCopy(StringView(value));
105 }
106 } else if constexpr (Policy == LAST_WIN) {
107 nulls.erase(key);
108 keyValues.insert_or_assign(key, value);
109 } else {
110 BOLT_UNREACHABLE();
111 }
112 };
113 auto processKeyValueWithNull = [&](std::string_view entry) {
114 if constexpr (IsFlinkCompatible) {
115 if (entry.empty()) {
116 return;
117 }
118 }
119 if constexpr (Policy == EXCEPTION) {
120 BOLT_USER_CHECK(

Callers

nothing calls this directly

Calls 15

ensureWritableFunction · 0.85
MAPFunction · 0.85
javaStyleSplitRegexFunction · 0.85
applyToSelectedMethod · 0.80
add_itemMethod · 0.80
add_nullMethod · 0.80
StringViewClass · 0.50
poolMethod · 0.45
initMethod · 0.45
setOffsetMethod · 0.45
isNullAtMethod · 0.45

Tested by

no test coverage detected