Skip to content

Commit 240fe5f

Browse files
committed
[realppl 4] Array, debug, field and logical expressions
1 parent a1c3a61 commit 240fe5f

File tree

10 files changed

+2982
-8
lines changed

10 files changed

+2982
-8
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: 773 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
@@ -287,6 +287,272 @@ class CoreMod : public EvaluableExpr {
287287
std::unique_ptr<api::FunctionExpr> expr_;
288288
};
289289

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

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);

0 commit comments

Comments
 (0)