Skip to content

Commit 2a1c2c4

Browse files
committed
[realppl 4] Array, debug, field and logical expressions
1 parent ced95b4 commit 2a1c2c4

File tree

13 files changed

+2989
-23
lines changed

13 files changed

+2989
-23
lines changed

Firestore/Example/Firestore.xcodeproj/project.pbxproj

Lines changed: 59 additions & 3 deletions
Large diffs are not rendered by default.

Firestore/core/src/core/expressions_eval.cc

Lines changed: 770 additions & 5 deletions
Large diffs are not rendered by default.

Firestore/core/src/core/expressions_eval.h

Lines changed: 266 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,6 +289,272 @@ class CoreMod : public EvaluableExpr {
289289
std::unique_ptr<api::FunctionExpr> expr_;
290290
};
291291

292+
// --- Array Expressions ---
293+
294+
class CoreArrayReverse : public EvaluableExpr {
295+
public:
296+
explicit CoreArrayReverse(const api::FunctionExpr& expr)
297+
: expr_(std::make_unique<api::FunctionExpr>(expr)) {
298+
}
299+
EvaluateResult Evaluate(
300+
const api::EvaluateContext& context,
301+
const model::PipelineInputOutput& document) const override;
302+
303+
private:
304+
std::unique_ptr<api::FunctionExpr> expr_;
305+
};
306+
307+
class CoreArrayContains : public EvaluableExpr {
308+
public:
309+
explicit CoreArrayContains(const api::FunctionExpr& expr)
310+
: expr_(std::make_unique<api::FunctionExpr>(expr)) {
311+
}
312+
EvaluateResult Evaluate(
313+
const api::EvaluateContext& context,
314+
const model::PipelineInputOutput& document) const override;
315+
316+
private:
317+
std::unique_ptr<api::FunctionExpr> expr_;
318+
};
319+
320+
class CoreArrayContainsAll : public EvaluableExpr {
321+
public:
322+
explicit CoreArrayContainsAll(const api::FunctionExpr& expr)
323+
: expr_(std::make_unique<api::FunctionExpr>(expr)) {
324+
}
325+
EvaluateResult Evaluate(
326+
const api::EvaluateContext& context,
327+
const model::PipelineInputOutput& document) const override;
328+
329+
private:
330+
std::unique_ptr<api::FunctionExpr> expr_;
331+
};
332+
333+
class CoreArrayContainsAny : public EvaluableExpr {
334+
public:
335+
explicit CoreArrayContainsAny(const api::FunctionExpr& expr)
336+
: expr_(std::make_unique<api::FunctionExpr>(expr)) {
337+
}
338+
EvaluateResult Evaluate(
339+
const api::EvaluateContext& context,
340+
const model::PipelineInputOutput& document) const override;
341+
342+
private:
343+
std::unique_ptr<api::FunctionExpr> expr_;
344+
};
345+
346+
class CoreArrayLength : public EvaluableExpr {
347+
public:
348+
explicit CoreArrayLength(const api::FunctionExpr& expr)
349+
: expr_(std::make_unique<api::FunctionExpr>(expr)) {
350+
}
351+
EvaluateResult Evaluate(
352+
const api::EvaluateContext& context,
353+
const model::PipelineInputOutput& document) const override;
354+
355+
private:
356+
std::unique_ptr<api::FunctionExpr> expr_;
357+
};
358+
359+
// --- Logical Expressions ---
360+
361+
class CoreAnd : public EvaluableExpr {
362+
public:
363+
explicit CoreAnd(const api::FunctionExpr& expr)
364+
: expr_(std::make_unique<api::FunctionExpr>(expr)) {
365+
}
366+
EvaluateResult Evaluate(
367+
const api::EvaluateContext& context,
368+
const model::PipelineInputOutput& document) const override;
369+
370+
private:
371+
std::unique_ptr<api::FunctionExpr> expr_;
372+
};
373+
374+
class CoreOr : public EvaluableExpr {
375+
public:
376+
explicit CoreOr(const api::FunctionExpr& expr)
377+
: expr_(std::make_unique<api::FunctionExpr>(expr)) {
378+
}
379+
EvaluateResult Evaluate(
380+
const api::EvaluateContext& context,
381+
const model::PipelineInputOutput& document) const override;
382+
383+
private:
384+
std::unique_ptr<api::FunctionExpr> expr_;
385+
};
386+
387+
class CoreXor : public EvaluableExpr {
388+
public:
389+
explicit CoreXor(const api::FunctionExpr& expr)
390+
: expr_(std::make_unique<api::FunctionExpr>(expr)) {
391+
}
392+
EvaluateResult Evaluate(
393+
const api::EvaluateContext& context,
394+
const model::PipelineInputOutput& document) const override;
395+
396+
private:
397+
std::unique_ptr<api::FunctionExpr> expr_;
398+
};
399+
400+
class CoreCond : public EvaluableExpr {
401+
public:
402+
explicit CoreCond(const api::FunctionExpr& expr)
403+
: expr_(std::make_unique<api::FunctionExpr>(expr)) {
404+
}
405+
EvaluateResult Evaluate(
406+
const api::EvaluateContext& context,
407+
const model::PipelineInputOutput& document) const override;
408+
409+
private:
410+
std::unique_ptr<api::FunctionExpr> expr_;
411+
};
412+
413+
class CoreEqAny : public EvaluableExpr {
414+
public:
415+
explicit CoreEqAny(const api::FunctionExpr& expr)
416+
: expr_(std::make_unique<api::FunctionExpr>(expr)) {
417+
}
418+
EvaluateResult Evaluate(
419+
const api::EvaluateContext& context,
420+
const model::PipelineInputOutput& document) const override;
421+
422+
private:
423+
std::unique_ptr<api::FunctionExpr> expr_;
424+
};
425+
426+
class CoreNotEqAny : public EvaluableExpr {
427+
public:
428+
explicit CoreNotEqAny(const api::FunctionExpr& expr)
429+
: expr_(std::make_unique<api::FunctionExpr>(expr)) {
430+
}
431+
EvaluateResult Evaluate(
432+
const api::EvaluateContext& context,
433+
const model::PipelineInputOutput& document) const override;
434+
435+
private:
436+
std::unique_ptr<api::FunctionExpr> expr_;
437+
};
438+
439+
class CoreIsNan : public EvaluableExpr {
440+
public:
441+
explicit CoreIsNan(const api::FunctionExpr& expr)
442+
: expr_(std::make_unique<api::FunctionExpr>(expr)) {
443+
}
444+
EvaluateResult Evaluate(
445+
const api::EvaluateContext& context,
446+
const model::PipelineInputOutput& document) const override;
447+
448+
private:
449+
std::unique_ptr<api::FunctionExpr> expr_;
450+
};
451+
452+
class CoreIsNotNan : public EvaluableExpr {
453+
public:
454+
explicit CoreIsNotNan(const api::FunctionExpr& expr)
455+
: expr_(std::make_unique<api::FunctionExpr>(expr)) {
456+
}
457+
EvaluateResult Evaluate(
458+
const api::EvaluateContext& context,
459+
const model::PipelineInputOutput& document) const override;
460+
461+
private:
462+
std::unique_ptr<api::FunctionExpr> expr_;
463+
};
464+
465+
class CoreIsNull : public EvaluableExpr {
466+
public:
467+
explicit CoreIsNull(const api::FunctionExpr& expr)
468+
: expr_(std::make_unique<api::FunctionExpr>(expr)) {
469+
}
470+
EvaluateResult Evaluate(
471+
const api::EvaluateContext& context,
472+
const model::PipelineInputOutput& document) const override;
473+
474+
private:
475+
std::unique_ptr<api::FunctionExpr> expr_;
476+
};
477+
478+
class CoreIsNotNull : public EvaluableExpr {
479+
public:
480+
explicit CoreIsNotNull(const api::FunctionExpr& expr)
481+
: expr_(std::make_unique<api::FunctionExpr>(expr)) {
482+
}
483+
EvaluateResult Evaluate(
484+
const api::EvaluateContext& context,
485+
const model::PipelineInputOutput& document) const override;
486+
487+
private:
488+
std::unique_ptr<api::FunctionExpr> expr_;
489+
};
490+
491+
class CoreIsError : public EvaluableExpr {
492+
public:
493+
explicit CoreIsError(const api::FunctionExpr& expr)
494+
: expr_(std::make_unique<api::FunctionExpr>(expr)) {
495+
}
496+
EvaluateResult Evaluate(
497+
const api::EvaluateContext& context,
498+
const model::PipelineInputOutput& document) const override;
499+
500+
private:
501+
std::unique_ptr<api::FunctionExpr> expr_;
502+
};
503+
504+
class CoreLogicalMaximum : public EvaluableExpr {
505+
public:
506+
explicit CoreLogicalMaximum(const api::FunctionExpr& expr)
507+
: expr_(std::make_unique<api::FunctionExpr>(expr)) {
508+
}
509+
EvaluateResult Evaluate(
510+
const api::EvaluateContext& context,
511+
const model::PipelineInputOutput& document) const override;
512+
513+
private:
514+
std::unique_ptr<api::FunctionExpr> expr_;
515+
};
516+
517+
class CoreLogicalMinimum : public EvaluableExpr {
518+
public:
519+
explicit CoreLogicalMinimum(const api::FunctionExpr& expr)
520+
: expr_(std::make_unique<api::FunctionExpr>(expr)) {
521+
}
522+
EvaluateResult Evaluate(
523+
const api::EvaluateContext& context,
524+
const model::PipelineInputOutput& document) const override;
525+
526+
private:
527+
std::unique_ptr<api::FunctionExpr> expr_;
528+
};
529+
530+
// --- Debugging Expressions ---
531+
532+
class CoreExists : public EvaluableExpr {
533+
public:
534+
explicit CoreExists(const api::FunctionExpr& expr)
535+
: expr_(std::make_unique<api::FunctionExpr>(expr)) {
536+
}
537+
EvaluateResult Evaluate(
538+
const api::EvaluateContext& context,
539+
const model::PipelineInputOutput& document) const override;
540+
541+
private:
542+
std::unique_ptr<api::FunctionExpr> expr_;
543+
};
544+
545+
class CoreNot : public EvaluableExpr {
546+
public:
547+
explicit CoreNot(const api::FunctionExpr& expr)
548+
: expr_(std::make_unique<api::FunctionExpr>(expr)) {
549+
}
550+
EvaluateResult Evaluate(
551+
const api::EvaluateContext& context,
552+
const model::PipelineInputOutput& document) const override;
553+
554+
private:
555+
std::unique_ptr<api::FunctionExpr> expr_;
556+
};
557+
292558
/**
293559
* Converts a high-level expression representation into an evaluable one.
294560
*/

Firestore/core/src/model/value_util.cc

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -955,6 +955,20 @@ Message<google_firestore_v1_Value> RefValue(
955955
return result;
956956
}
957957

958+
Message<google_firestore_v1_Value> ArrayValue(
959+
std::vector<Message<google_firestore_v1_Value>> values) {
960+
google_firestore_v1_Value result;
961+
result.which_value_type = google_firestore_v1_Value_array_value_tag;
962+
963+
SetRepeatedField(&result.array_value.values, &result.array_value.values_count,
964+
values.begin(), values.end(),
965+
[](Message<google_firestore_v1_Value>& value) {
966+
return *value.release();
967+
});
968+
969+
return nanopb::MakeMessage(result);
970+
}
971+
958972
Message<google_firestore_v1_Value> DeepClone(
959973
const google_firestore_v1_Value& source) {
960974
Message<google_firestore_v1_Value> target{source};

Firestore/core/src/model/value_util.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,14 @@ google_firestore_v1_Value MinMap();
248248
nanopb::Message<google_firestore_v1_Value> RefValue(
249249
const DatabaseId& database_id, const DocumentKey& document_key);
250250

251+
/**
252+
* Returns a Protobuf array value representing the given values.
253+
*
254+
* This function owns the passed in vector and might move the values out.
255+
*/
256+
nanopb::Message<google_firestore_v1_Value> ArrayValue(
257+
std::vector<nanopb::Message<google_firestore_v1_Value>> values);
258+
251259
/** Creates a copy of the contents of the Value proto. */
252260
nanopb::Message<google_firestore_v1_Value> DeepClone(
253261
const google_firestore_v1_Value& source);

Firestore/core/test/unit/core/expressions/arithmetic_test.cc

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,14 @@
1414
* limitations under the License.
1515
*/
1616

17-
#include "Firestore/core/src/core/expressions_eval.h"
18-
1917
#include <initializer_list>
2018
#include <limits>
2119
#include <memory>
2220
#include <string>
2321
#include <utility>
2422
#include <vector>
2523

24+
#include "Firestore/core/src/core/expressions_eval.h"
2625
#include "Firestore/core/test/unit/testutil/expression_test_util.h"
2726
#include "Firestore/core/test/unit/testutil/testutil.h"
2827
#include "gmock/gmock.h"

0 commit comments

Comments
 (0)