MCPcopy Create free account
hub / github.com/documentdb/documentdb / InMatchIsEquvalentTo

Function InMatchIsEquvalentTo

pg_documentdb/src/planner/documents_planner.c:338–397  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

336
337
338bool
339InMatchIsEquvalentTo(ScalarArrayOpExpr *opExpr, const bson_value_t *arrayValue)
340{
341 if (opExpr == NULL || arrayValue->value_type != BSON_TYPE_ARRAY)
342 {
343 return false;
344 }
345
346 List *inMatchArgs = opExpr->args;
347 if (list_length(inMatchArgs) != 2)
348 {
349 return false;
350 }
351
352 if (!IsA(lsecond(inMatchArgs), Const))
353 {
354 return false;
355 }
356
357 Const *secondMatch = (Const *) lsecond(inMatchArgs);
358
359 bson_iter_t arrayValueIter;
360 BsonValueInitIterator(arrayValue, &arrayValueIter);
361
362 ArrayType *inArrayValue = DatumGetArrayTypeP(secondMatch->constvalue);
363
364 const int slice_ndim = 0;
365 ArrayMetaState *mState = NULL;
366 ArrayIterator inArrayIterator = array_create_iterator(inArrayValue, slice_ndim,
367 mState);
368 Datum arrayDatum = { 0 };
369 bool isNull = false;
370 while (array_iterate(inArrayIterator, &arrayDatum, &isNull))
371 {
372 if (!bson_iter_next(&arrayValueIter) || isNull)
373 {
374 array_free_iterator(inArrayIterator);
375 return false;
376 }
377
378 const bson_value_t *rightValue = bson_iter_value(&arrayValueIter);
379 pgbsonelement leftElement = { 0 };
380 pgbson *leftBson = DatumGetPgBsonPacked(arrayDatum);
381 PgbsonToSinglePgbsonElement(leftBson, &leftElement);
382
383 if (!BsonValueEquals(&leftElement.bsonValue, rightValue))
384 {
385 array_free_iterator(inArrayIterator);
386 return false;
387 }
388 }
389
390 array_free_iterator(inArrayIterator);
391 if (bson_iter_next(&arrayValueIter))
392 {
393 return false;
394 }
395

Calls 3

BsonValueInitIteratorFunction · 0.85
BsonValueEqualsFunction · 0.85

Tested by

no test coverage detected