blob: 16870539959240242102d72b8d80a36b42d77184 [file]
/*
* 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.
*/
#pragma once
#include <nlohmann/json_fwd.hpp>
#include "iceberg/expression/expression.h"
#include "iceberg/iceberg_export.h"
#include "iceberg/result.h"
#include "iceberg/type_fwd.h"
/// \file iceberg/expression/json_serde_internal.h
/// JSON serialization and deserialization for expressions.
namespace iceberg {
/// \brief Converts an operation type string to an Expression::Operation.
///
/// \param typeStr The operation type string
/// \return The corresponding Operation or an error if unknown
ICEBERG_EXPORT Result<Expression::Operation> OperationTypeFromJson(
const nlohmann::json& json);
/// \brief Converts an Expression::Operation to its json representation.
///
/// \param op The operation to convert
/// \return The operation type string (e.g., "eq", "lt-eq", "is-null")
ICEBERG_EXPORT nlohmann::json ToJson(Expression::Operation op);
/// \brief Deserializes a JSON object into an Expression.
///
/// \param json A JSON object representing an expression
/// \param schema Optional schema used to bind field references and coerce literal
/// types.
/// \return A shared pointer to the deserialized Expression or an error
ICEBERG_EXPORT Result<std::shared_ptr<Expression>> ExpressionFromJson(
const nlohmann::json& json, const Schema* schema = nullptr);
/// \brief Serializes an Expression into its JSON representation.
///
/// \param expr The expression to serialize
/// \return A JSON object representing the expression, or an error
ICEBERG_EXPORT Result<nlohmann::json> ToJson(const Expression& expr);
/// \brief Deserializes a JSON object into a NamedReference.
///
/// \param json A JSON object representing a named reference
/// \return A shared pointer to the deserialized NamedReference or an error
ICEBERG_EXPORT Result<std::unique_ptr<NamedReference>> NamedReferenceFromJson(
const nlohmann::json& json);
/// \brief Serializes a NamedReference into its JSON representation.
///
/// \param ref The named reference to serialize
/// \return A JSON object representing the named reference, or an error
ICEBERG_EXPORT nlohmann::json ToJson(const NamedReference& ref);
/// \brief Serializes an UnboundTransform into its JSON representation.
///
/// \param transform The unbound transform to serialize
/// \return A JSON object representing the unbound transform, or an error
ICEBERG_EXPORT nlohmann::json ToJson(const UnboundTransform& transform);
/// \brief Deserializes a JSON object into an UnboundTransform.
///
/// \param json A JSON object representing an unbound transform
/// \return A shared pointer to the deserialized UnboundTransform or an error
ICEBERG_EXPORT Result<std::unique_ptr<UnboundTransform>> UnboundTransformFromJson(
const nlohmann::json& json);
/// \brief Serializes a Literal into its JSON representation.
///
/// \param literal The literal to serialize
/// \return A JSON value representing the literal, or an error
ICEBERG_EXPORT Result<nlohmann::json> ToJson(const Literal& literal);
/// \brief Deserializes a JSON value into a Literal.
///
/// \param json A JSON value representing a literal.
/// \return The deserialized Literal or an error.
ICEBERG_EXPORT Result<Literal> LiteralFromJson(const nlohmann::json& json);
/// \brief Deserializes a JSON value into a Literal with optional type context.
///
/// \param json A JSON value representing a literal.
/// \param type Optional target type used to guide parsing.
/// \return The deserialized Literal or an error.
ICEBERG_EXPORT Result<Literal> LiteralFromJson(const nlohmann::json& json,
const Type* type);
/// \brief Serializes an UnboundPredicate into its JSON representation.
///
/// \param pred The unbound predicate to serialize
/// \return A JSON object representing the predicate, or an error
ICEBERG_EXPORT Result<nlohmann::json> ToJson(const UnboundPredicate& pred);
/// \brief Serializes a BoundReference into its JSON representation (field name string).
ICEBERG_EXPORT nlohmann::json ToJson(const BoundReference& ref);
/// \brief Serializes a BoundTransform into its JSON representation.
ICEBERG_EXPORT nlohmann::json ToJson(const BoundTransform& transform);
/// \brief Serializes a BoundPredicate into its JSON representation.
ICEBERG_EXPORT Result<nlohmann::json> ToJson(const BoundPredicate& pred);
/// \brief Deserializes a JSON object into an UnboundPredicate.
///
/// \param json A JSON object representing an unbound predicate
/// \param schema Optional schema used to resolve literal types.
/// \return A pointer to the deserialized UnboundPredicate or an error
ICEBERG_EXPORT Result<std::unique_ptr<UnboundPredicate>> UnboundPredicateFromJson(
const nlohmann::json& json, const Schema* schema = nullptr);
/// \brief Serializes a Term into its JSON representation.
///
/// \param term The term to serialize (NamedReference or UnboundTransform)
/// \return A JSON value representing the term, or an error
ICEBERG_EXPORT Result<nlohmann::json> ToJson(const Term& term);
/// Check if an operation is a unary predicate
ICEBERG_EXPORT bool IsUnaryOperation(Expression::Operation op);
/// Check if an operation is a set predicate
ICEBERG_EXPORT bool IsSetOperation(Expression::Operation op);
} // namespace iceberg