Skip to content

[realppl 4] Array, debug, field and logical expressions #14850

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: wuandy/RealPpl_3
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
62 changes: 59 additions & 3 deletions Firestore/Example/Firestore.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

778 changes: 773 additions & 5 deletions Firestore/core/src/core/expressions_eval.cc

Large diffs are not rendered by default.

266 changes: 266 additions & 0 deletions Firestore/core/src/core/expressions_eval.h
Original file line number Diff line number Diff line change
Expand Up @@ -287,6 +287,272 @@ class CoreMod : public EvaluableExpr {
std::unique_ptr<api::FunctionExpr> expr_;
};

// --- Array Expressions ---

class CoreArrayReverse : public EvaluableExpr {
public:
explicit CoreArrayReverse(const api::FunctionExpr& expr)
: expr_(std::make_unique<api::FunctionExpr>(expr)) {
}
EvaluateResult Evaluate(
const api::EvaluateContext& context,
const model::PipelineInputOutput& document) const override;

private:
std::unique_ptr<api::FunctionExpr> expr_;
};

class CoreArrayContains : public EvaluableExpr {
public:
explicit CoreArrayContains(const api::FunctionExpr& expr)
: expr_(std::make_unique<api::FunctionExpr>(expr)) {
}
EvaluateResult Evaluate(
const api::EvaluateContext& context,
const model::PipelineInputOutput& document) const override;

private:
std::unique_ptr<api::FunctionExpr> expr_;
};

class CoreArrayContainsAll : public EvaluableExpr {
public:
explicit CoreArrayContainsAll(const api::FunctionExpr& expr)
: expr_(std::make_unique<api::FunctionExpr>(expr)) {
}
EvaluateResult Evaluate(
const api::EvaluateContext& context,
const model::PipelineInputOutput& document) const override;

private:
std::unique_ptr<api::FunctionExpr> expr_;
};

class CoreArrayContainsAny : public EvaluableExpr {
public:
explicit CoreArrayContainsAny(const api::FunctionExpr& expr)
: expr_(std::make_unique<api::FunctionExpr>(expr)) {
}
EvaluateResult Evaluate(
const api::EvaluateContext& context,
const model::PipelineInputOutput& document) const override;

private:
std::unique_ptr<api::FunctionExpr> expr_;
};

class CoreArrayLength : public EvaluableExpr {
public:
explicit CoreArrayLength(const api::FunctionExpr& expr)
: expr_(std::make_unique<api::FunctionExpr>(expr)) {
}
EvaluateResult Evaluate(
const api::EvaluateContext& context,
const model::PipelineInputOutput& document) const override;

private:
std::unique_ptr<api::FunctionExpr> expr_;
};

// --- Logical Expressions ---

class CoreAnd : public EvaluableExpr {
public:
explicit CoreAnd(const api::FunctionExpr& expr)
: expr_(std::make_unique<api::FunctionExpr>(expr)) {
}
EvaluateResult Evaluate(
const api::EvaluateContext& context,
const model::PipelineInputOutput& document) const override;

private:
std::unique_ptr<api::FunctionExpr> expr_;
};

class CoreOr : public EvaluableExpr {
public:
explicit CoreOr(const api::FunctionExpr& expr)
: expr_(std::make_unique<api::FunctionExpr>(expr)) {
}
EvaluateResult Evaluate(
const api::EvaluateContext& context,
const model::PipelineInputOutput& document) const override;

private:
std::unique_ptr<api::FunctionExpr> expr_;
};

class CoreXor : public EvaluableExpr {
public:
explicit CoreXor(const api::FunctionExpr& expr)
: expr_(std::make_unique<api::FunctionExpr>(expr)) {
}
EvaluateResult Evaluate(
const api::EvaluateContext& context,
const model::PipelineInputOutput& document) const override;

private:
std::unique_ptr<api::FunctionExpr> expr_;
};

class CoreCond : public EvaluableExpr {
public:
explicit CoreCond(const api::FunctionExpr& expr)
: expr_(std::make_unique<api::FunctionExpr>(expr)) {
}
EvaluateResult Evaluate(
const api::EvaluateContext& context,
const model::PipelineInputOutput& document) const override;

private:
std::unique_ptr<api::FunctionExpr> expr_;
};

class CoreEqAny : public EvaluableExpr {
public:
explicit CoreEqAny(const api::FunctionExpr& expr)
: expr_(std::make_unique<api::FunctionExpr>(expr)) {
}
EvaluateResult Evaluate(
const api::EvaluateContext& context,
const model::PipelineInputOutput& document) const override;

private:
std::unique_ptr<api::FunctionExpr> expr_;
};

class CoreNotEqAny : public EvaluableExpr {
public:
explicit CoreNotEqAny(const api::FunctionExpr& expr)
: expr_(std::make_unique<api::FunctionExpr>(expr)) {
}
EvaluateResult Evaluate(
const api::EvaluateContext& context,
const model::PipelineInputOutput& document) const override;

private:
std::unique_ptr<api::FunctionExpr> expr_;
};

class CoreIsNan : public EvaluableExpr {
public:
explicit CoreIsNan(const api::FunctionExpr& expr)
: expr_(std::make_unique<api::FunctionExpr>(expr)) {
}
EvaluateResult Evaluate(
const api::EvaluateContext& context,
const model::PipelineInputOutput& document) const override;

private:
std::unique_ptr<api::FunctionExpr> expr_;
};

class CoreIsNotNan : public EvaluableExpr {
public:
explicit CoreIsNotNan(const api::FunctionExpr& expr)
: expr_(std::make_unique<api::FunctionExpr>(expr)) {
}
EvaluateResult Evaluate(
const api::EvaluateContext& context,
const model::PipelineInputOutput& document) const override;

private:
std::unique_ptr<api::FunctionExpr> expr_;
};

class CoreIsNull : public EvaluableExpr {
public:
explicit CoreIsNull(const api::FunctionExpr& expr)
: expr_(std::make_unique<api::FunctionExpr>(expr)) {
}
EvaluateResult Evaluate(
const api::EvaluateContext& context,
const model::PipelineInputOutput& document) const override;

private:
std::unique_ptr<api::FunctionExpr> expr_;
};

class CoreIsNotNull : public EvaluableExpr {
public:
explicit CoreIsNotNull(const api::FunctionExpr& expr)
: expr_(std::make_unique<api::FunctionExpr>(expr)) {
}
EvaluateResult Evaluate(
const api::EvaluateContext& context,
const model::PipelineInputOutput& document) const override;

private:
std::unique_ptr<api::FunctionExpr> expr_;
};

class CoreIsError : public EvaluableExpr {
public:
explicit CoreIsError(const api::FunctionExpr& expr)
: expr_(std::make_unique<api::FunctionExpr>(expr)) {
}
EvaluateResult Evaluate(
const api::EvaluateContext& context,
const model::PipelineInputOutput& document) const override;

private:
std::unique_ptr<api::FunctionExpr> expr_;
};

class CoreLogicalMaximum : public EvaluableExpr {
public:
explicit CoreLogicalMaximum(const api::FunctionExpr& expr)
: expr_(std::make_unique<api::FunctionExpr>(expr)) {
}
EvaluateResult Evaluate(
const api::EvaluateContext& context,
const model::PipelineInputOutput& document) const override;

private:
std::unique_ptr<api::FunctionExpr> expr_;
};

class CoreLogicalMinimum : public EvaluableExpr {
public:
explicit CoreLogicalMinimum(const api::FunctionExpr& expr)
: expr_(std::make_unique<api::FunctionExpr>(expr)) {
}
EvaluateResult Evaluate(
const api::EvaluateContext& context,
const model::PipelineInputOutput& document) const override;

private:
std::unique_ptr<api::FunctionExpr> expr_;
};

// --- Debugging Expressions ---

class CoreExists : public EvaluableExpr {
public:
explicit CoreExists(const api::FunctionExpr& expr)
: expr_(std::make_unique<api::FunctionExpr>(expr)) {
}
EvaluateResult Evaluate(
const api::EvaluateContext& context,
const model::PipelineInputOutput& document) const override;

private:
std::unique_ptr<api::FunctionExpr> expr_;
};

class CoreNot : public EvaluableExpr {
public:
explicit CoreNot(const api::FunctionExpr& expr)
: expr_(std::make_unique<api::FunctionExpr>(expr)) {
}
EvaluateResult Evaluate(
const api::EvaluateContext& context,
const model::PipelineInputOutput& document) const override;

private:
std::unique_ptr<api::FunctionExpr> expr_;
};

/**
* Converts a high-level expression representation into an evaluable one.
*/
Expand Down
14 changes: 14 additions & 0 deletions Firestore/core/src/model/value_util.cc
Original file line number Diff line number Diff line change
Expand Up @@ -955,6 +955,20 @@ Message<google_firestore_v1_Value> RefValue(
return result;
}

Message<google_firestore_v1_Value> ArrayValue(
std::vector<Message<google_firestore_v1_Value>> values) {
google_firestore_v1_Value result;
result.which_value_type = google_firestore_v1_Value_array_value_tag;

SetRepeatedField(&result.array_value.values, &result.array_value.values_count,
values.begin(), values.end(),
[](Message<google_firestore_v1_Value>& value) {
return *value.release();
});

return nanopb::MakeMessage(result);
}

Message<google_firestore_v1_Value> DeepClone(
const google_firestore_v1_Value& source) {
Message<google_firestore_v1_Value> target{source};
Expand Down
8 changes: 8 additions & 0 deletions Firestore/core/src/model/value_util.h
Original file line number Diff line number Diff line change
Expand Up @@ -248,6 +248,14 @@ google_firestore_v1_Value MinMap();
nanopb::Message<google_firestore_v1_Value> RefValue(
const DatabaseId& database_id, const DocumentKey& document_key);

/**
* Returns a Protobuf array value representing the given values.
*
* This function owns the passed in vector and might move the values out.
*/
nanopb::Message<google_firestore_v1_Value> ArrayValue(
std::vector<nanopb::Message<google_firestore_v1_Value>> values);

/** Creates a copy of the contents of the Value proto. */
nanopb::Message<google_firestore_v1_Value> DeepClone(
const google_firestore_v1_Value& source);
Expand Down
Loading
Loading