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

Function IndexKeyDocumentEquivalent

pg_documentdb/src/metadata/index.c:2507–2586  ·  view source on GitHub ↗

* Checks if Index keys are equivalent. The keys are equal if everything * matches. They are equivalent if one index key can be treated as the same * index key to another index even if it's not an exact match (e.g. text indexes). * Otherwise, the keys are not equal. */

Source from the content-addressed store, hash-verified

2505 * Otherwise, the keys are not equal.
2506 */
2507static IndexOptionsEquivalency
2508IndexKeyDocumentEquivalent(pgbson *leftKey, pgbson *rightKey)
2509{
2510 if (PgbsonEquals(leftKey, rightKey))
2511 {
2512 return IndexOptionsEquivalency_Equal;
2513 }
2514
2515 /*
2516 * Here we check for multiple things:
2517 * If left or right has at least one text index, they're automatically equivalent.
2518 * Are the keys/values unequal - then not equivalent
2519 * If count(left keys) != count(right keys) then not equivalent.
2520 */
2521 bool leftHasTextIndexes = false;
2522 bool rightHasTextIndexes = false;
2523 bool areEqual = true;
2524
2525 /* The equivalency matters for text indexes */
2526 bson_iter_t leftIter;
2527 bson_iter_t rightIter;
2528 PgbsonInitIterator(leftKey, &leftIter);
2529 PgbsonInitIterator(rightKey, &rightIter);
2530 bool leftHasNext = bson_iter_next(&leftIter);
2531 bool rightHasNext = bson_iter_next(&rightIter);
2532
2533 while (leftHasNext && rightHasNext)
2534 {
2535 if (areEqual && strcmp(bson_iter_key(&leftIter), bson_iter_key(&rightIter)) != 0)
2536 {
2537 areEqual = false;
2538 }
2539
2540 const bson_value_t *leftValue = bson_iter_value(&leftIter);
2541 const bson_value_t *rightValue = bson_iter_value(&rightIter);
2542
2543 if (areEqual && !BsonValueEquals(leftValue, rightValue))
2544 {
2545 areEqual = false;
2546 }
2547
2548 leftHasTextIndexes = leftHasTextIndexes || IsTextIndex(leftValue);
2549 rightHasTextIndexes = rightHasTextIndexes || IsTextIndex(rightValue);
2550
2551 leftHasNext = bson_iter_next(&leftIter);
2552 rightHasNext = bson_iter_next(&rightIter);
2553 }
2554
2555 while (leftHasNext)
2556 {
2557 areEqual = false;
2558 const bson_value_t *leftValue = bson_iter_value(&leftIter);
2559 leftHasTextIndexes = leftHasTextIndexes || IsTextIndex(leftValue);
2560 leftHasNext = bson_iter_next(&leftIter);
2561 }
2562
2563 while (rightHasNext)
2564 {

Callers 1

Calls 4

PgbsonEqualsFunction · 0.85
PgbsonInitIteratorFunction · 0.85
BsonValueEqualsFunction · 0.85
IsTextIndexFunction · 0.70

Tested by

no test coverage detected