From a39a4b108099346b129cb162edbbf85456ca650c Mon Sep 17 00:00:00 2001 From: Alexis Arnaud Date: Wed, 7 Aug 2024 11:31:36 +0200 Subject: [PATCH] better --- .../Serializations/SerializationArray.cpp | 29 +++++++++++++--- .../Serializations/SerializationMap.cpp | 29 +++++++++++++--- .../Serializations/SerializationMap.h | 2 +- .../Serializations/SerializationTuple.cpp | 33 +++++++++++++++---- .../Serializations/SerializationTuple.h | 4 +-- src/Formats/JSONUtils.h | 4 +-- 6 files changed, 79 insertions(+), 22 deletions(-) diff --git a/src/DataTypes/Serializations/SerializationArray.cpp b/src/DataTypes/Serializations/SerializationArray.cpp index 5891a0a6e75..60f908a249b 100644 --- a/src/DataTypes/Serializations/SerializationArray.cpp +++ b/src/DataTypes/Serializations/SerializationArray.cpp @@ -618,7 +618,7 @@ void SerializationArray::serializeTextJSONPretty(const IColumn & column, size_t namespace { template -ReturnType deserializeTextJSONArrayImpl(IColumn & column, ReadBuffer & istr, const SerializationPtr & nested, const FormatSettings & settings) +ReturnType deserializeEmpyStringAsDefaultOrNested(IColumn & column, ReadBuffer & istr, const SerializationPtr & nested, const FormatSettings & settings) { auto deserializer = [&nested](IColumn & column_, ReadBuffer & istr_, auto && deserialize_nested) -> ReturnType { @@ -626,21 +626,40 @@ ReturnType deserializeTextJSONArrayImpl(IColumn & column, ReadBuffer & istr, con { return deserialize_nested(nested_column, istr_, nested); }; - return deserializeTextImpl(column_, istr_, adapter, false); + return deserializeTextImpl(column_, istr_, std::move(adapter), false); }; - return JSONUtils::deserializeEmpyStringAsDefaultOrNested(column, istr, settings, deserializer); + return JSONUtils::deserializeEmpyStringAsDefaultOrNested(column, istr, settings, std::move(deserializer)); } } void SerializationArray::deserializeTextJSON(IColumn & column, ReadBuffer & istr, const FormatSettings & settings) const { - deserializeTextJSONArrayImpl(column, istr, nested, settings); + if (settings.json.empty_as_default) + deserializeEmpyStringAsDefaultOrNested(column, istr, nested, settings); + else + deserializeTextImpl(column, istr, + [&settings, &istr, this](IColumn & nested_column) + { + if (settings.null_as_default && !isColumnNullableOrLowCardinalityNullable(nested_column)) + SerializationNullable::deserializeNullAsDefaultOrNestedTextJSON(nested_column, istr, settings, nested); + else + nested->deserializeTextJSON(nested_column, istr, settings); + }, false); } bool SerializationArray::tryDeserializeTextJSON(IColumn & column, ReadBuffer & istr, const FormatSettings & settings) const { - return deserializeTextJSONArrayImpl(column, istr, nested, settings); + if (settings.json.empty_as_default) + return deserializeEmpyStringAsDefaultOrNested(column, istr, nested, settings); + + return deserializeTextImpl(column, istr, + [&settings, &istr, this](IColumn & nested_column) + { + if (settings.null_as_default && !isColumnNullableOrLowCardinalityNullable(nested_column)) + return SerializationNullable::tryDeserializeNullAsDefaultOrNestedTextJSON(nested_column, istr, settings, nested); + return nested->tryDeserializeTextJSON(nested_column, istr, settings); + }, false); } diff --git a/src/DataTypes/Serializations/SerializationMap.cpp b/src/DataTypes/Serializations/SerializationMap.cpp index 0412a85ee44..96c21f19805 100644 --- a/src/DataTypes/Serializations/SerializationMap.cpp +++ b/src/DataTypes/Serializations/SerializationMap.cpp @@ -317,7 +317,7 @@ void SerializationMap::serializeTextJSONPretty(const IColumn & column, size_t ro } template -ReturnType SerializationMap::deserializeTextJSONMapImpl(IColumn & column, ReadBuffer & istr, const FormatSettings & settings) const +ReturnType SerializationMap::deserializeEmpyStringAsDefaultOrNested(IColumn & column, ReadBuffer & istr, const FormatSettings & settings) const { auto deserializer = [this](IColumn & column_, ReadBuffer & istr_, auto && deserialize_nested) -> ReturnType { @@ -325,20 +325,39 @@ ReturnType SerializationMap::deserializeTextJSONMapImpl(IColumn & column, ReadBu { return deserialize_nested(nested_column, buf, nested_column_serialization); }; - return this->deserializeTextImpl(column_, istr_, adapter); + return this->deserializeTextImpl(column_, istr_, std::move(adapter)); }; - return JSONUtils::deserializeEmpyStringAsDefaultOrNested(column, istr, settings, deserializer); + return JSONUtils::deserializeEmpyStringAsDefaultOrNested(column, istr, settings, std::move(deserializer)); } void SerializationMap::deserializeTextJSON(IColumn & column, ReadBuffer & istr, const FormatSettings & settings) const { - deserializeTextJSONMapImpl(column, istr, settings); + if (settings.json.empty_as_default) + deserializeEmpyStringAsDefaultOrNested(column, istr, settings); + else + deserializeTextImpl(column, istr, + [&settings](ReadBuffer & buf, const SerializationPtr & subcolumn_serialization, IColumn & subcolumn) + { + if (settings.null_as_default && !isColumnNullableOrLowCardinalityNullable(subcolumn)) + SerializationNullable::deserializeNullAsDefaultOrNestedTextJSON(subcolumn, buf, settings, subcolumn_serialization); + else + subcolumn_serialization->deserializeTextJSON(subcolumn, buf, settings); + }); } bool SerializationMap::tryDeserializeTextJSON(IColumn & column, ReadBuffer & istr, const FormatSettings & settings) const { - return deserializeTextJSONMapImpl(column, istr, settings); + if (settings.json.empty_as_default) + return deserializeEmpyStringAsDefaultOrNested(column, istr, settings); + + return deserializeTextImpl(column, istr, + [&settings](ReadBuffer & buf, const SerializationPtr & subcolumn_serialization, IColumn & subcolumn) + { + if (settings.null_as_default && !isColumnNullableOrLowCardinalityNullable(subcolumn)) + return SerializationNullable::tryDeserializeNullAsDefaultOrNestedTextJSON(subcolumn, buf, settings, subcolumn_serialization); + return subcolumn_serialization->tryDeserializeTextJSON(subcolumn, buf, settings); + }); } void SerializationMap::serializeTextXML(const IColumn & column, size_t row_num, WriteBuffer & ostr, const FormatSettings & settings) const diff --git a/src/DataTypes/Serializations/SerializationMap.h b/src/DataTypes/Serializations/SerializationMap.h index 9bdc110c445..ddf8047f061 100644 --- a/src/DataTypes/Serializations/SerializationMap.h +++ b/src/DataTypes/Serializations/SerializationMap.h @@ -76,7 +76,7 @@ private: ReturnType deserializeTextImpl(IColumn & column, ReadBuffer & istr, Reader && reader) const; template - ReturnType deserializeTextJSONMapImpl(IColumn & column, ReadBuffer & istr, const FormatSettings & settings) const; + ReturnType deserializeEmpyStringAsDefaultOrNested(IColumn & column, ReadBuffer & istr, const FormatSettings & settings) const; }; } diff --git a/src/DataTypes/Serializations/SerializationTuple.cpp b/src/DataTypes/Serializations/SerializationTuple.cpp index 459677d40cd..f8cb894c19b 100644 --- a/src/DataTypes/Serializations/SerializationTuple.cpp +++ b/src/DataTypes/Serializations/SerializationTuple.cpp @@ -314,7 +314,7 @@ void SerializationTuple::serializeTextJSONPretty(const IColumn & column, size_t } template -ReturnType SerializationTuple::deserializeTextJSONTupleImpl(IColumn & column, ReadBuffer & istr, const FormatSettings & settings, auto && deserialize_element) const +ReturnType SerializationTuple::deserializeTextJSONImpl(IColumn & column, ReadBuffer & istr, const FormatSettings & settings, auto && deserialize_element) const { static constexpr auto throw_exception = std::is_same_v; @@ -490,29 +490,48 @@ ReturnType SerializationTuple::deserializeTextJSONTupleImpl(IColumn & column, Re } template -ReturnType SerializationTuple::deserializeTextJSONImpl(IColumn & column, ReadBuffer & istr, const FormatSettings & settings) const +ReturnType SerializationTuple::deserializeEmpyStringAsDefaultOrNested(IColumn & column, ReadBuffer & istr, const FormatSettings & settings) const { auto deserializer = [&settings, this](IColumn & column_, ReadBuffer & istr_, auto && deserialize_nested) -> ReturnType { auto adapter = [&deserialize_nested, &istr_, this](IColumn & nested_column, size_t element_pos) -> ReturnType { - return deserialize_nested(nested_column, istr_, this->elems[element_pos]); + return deserialize_nested(nested_column, istr_, elems[element_pos]); }; - return this->deserializeTextJSONTupleImpl(column_, istr_, settings, adapter); + return deserializeTextJSONImpl(column_, istr_, settings, std::move(adapter)); }; - return JSONUtils::deserializeEmpyStringAsDefaultOrNested(column, istr, settings, deserializer); + return JSONUtils::deserializeEmpyStringAsDefaultOrNested(column, istr, settings, std::move(deserializer)); } void SerializationTuple::deserializeTextJSON(DB::IColumn & column, DB::ReadBuffer & istr, const DB::FormatSettings & settings) const { - deserializeTextJSONImpl(column, istr, settings); + if (settings.json.empty_as_default) + deserializeEmpyStringAsDefaultOrNested(column, istr, settings); + else + deserializeTextJSONImpl(column, istr, settings, + [&settings, &istr, this](IColumn & nested_column, size_t element_pos) -> void + { + if (settings.null_as_default && !isColumnNullableOrLowCardinalityNullable(nested_column)) + SerializationNullable::deserializeNullAsDefaultOrNestedTextJSON(nested_column, istr, settings, elems[element_pos]); + else + elems[element_pos]->deserializeTextJSON(nested_column, istr, settings); + }); } bool SerializationTuple::tryDeserializeTextJSON(DB::IColumn & column, DB::ReadBuffer & istr, const DB::FormatSettings & settings) const { - return deserializeTextJSONImpl(column, istr, settings); + if (settings.json.empty_as_default) + return deserializeEmpyStringAsDefaultOrNested(column, istr, settings); + + return deserializeTextJSONImpl(column, istr, settings, + [&settings, &istr, this](IColumn & nested_column, size_t element_pos) -> bool + { + if (settings.null_as_default && !isColumnNullableOrLowCardinalityNullable(nested_column)) + return SerializationNullable::tryDeserializeNullAsDefaultOrNestedTextJSON(nested_column, istr, settings, elems[element_pos]); + return elems[element_pos]->tryDeserializeTextJSON(nested_column, istr, settings); + }); } diff --git a/src/DataTypes/Serializations/SerializationTuple.h b/src/DataTypes/Serializations/SerializationTuple.h index 4a55ea6eedf..54084617d3b 100644 --- a/src/DataTypes/Serializations/SerializationTuple.h +++ b/src/DataTypes/Serializations/SerializationTuple.h @@ -82,10 +82,10 @@ private: ReturnType deserializeTextImpl(IColumn & column, ReadBuffer & istr, const FormatSettings & settings, bool whole) const; template - ReturnType deserializeTextJSONTupleImpl(IColumn & column, ReadBuffer & istr, const FormatSettings & settings, auto && deserialize_element) const; + ReturnType deserializeTextJSONImpl(IColumn & column, ReadBuffer & istr, const FormatSettings & settings, auto && deserialize_element) const; template - ReturnType deserializeTextJSONImpl(IColumn & column, ReadBuffer & istr, const FormatSettings & settings) const; + ReturnType deserializeEmpyStringAsDefaultOrNested(IColumn & column, ReadBuffer & istr, const FormatSettings & settings) const; template ReturnType deserializeTextCSVImpl(IColumn & column, ReadBuffer & istr, const FormatSettings & settings) const; diff --git a/src/Formats/JSONUtils.h b/src/Formats/JSONUtils.h index 2800017bfed..a8e7113388a 100644 --- a/src/Formats/JSONUtils.h +++ b/src/Formats/JSONUtils.h @@ -181,9 +181,9 @@ namespace JSONUtils } }; - auto deserialize_nested = [&settings, &do_deserialize_nested, &deserialize_nested_impl](IColumn & nested_column, ReadBuffer & buf, const SerializationPtr & nested_column_serialization) -> ReturnType + auto deserialize_nested = [&do_deserialize_nested, &deserialize_nested_impl](IColumn & nested_column, ReadBuffer & buf, const SerializationPtr & nested_column_serialization) -> ReturnType { - if (!settings.json.empty_as_default || buf.eof() || *buf.position() != EMPTY_STRING[0]) + if (buf.eof() || *buf.position() != EMPTY_STRING[0]) return deserialize_nested_impl(nested_column, buf, nested_column_serialization); if (buf.available() >= EMPTY_STRING_LENGTH)