* 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. */
| 2505 | * Otherwise, the keys are not equal. |
| 2506 | */ |
| 2507 | static IndexOptionsEquivalency |
| 2508 | IndexKeyDocumentEquivalent(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 | { |
no test coverage detected