MCPcopy Create free account
hub / github.com/FoundationDB/fdb-document-layer / ExtIndexInsert

Class ExtIndexInsert

src/ExtMsg.actor.cpp:698–766  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

696};
697
698struct ExtIndexInsert : ConcreteInsertOp<ExtIndexInsert> {
699 bson::BSONObj indexObj;
700 std::string ns;
701 UID build_id;
702
703 ExtIndexInsert(bson::BSONObj indexObj, UID build_id, std::string ns)
704 : indexObj(indexObj), build_id(build_id), ns(ns) {}
705
706 std::string describe() override { return "IndexInsert(" + indexObj.toString() + ")"; }
707
708 ACTOR static Future<Reference<IReadWriteContext>> indexInsertActor(ExtIndexInsert* self,
709 Reference<CollectionContext> cx) {
710 state Standalone<StringRef> encodedId;
711 state Standalone<StringRef> valueEncodedId;
712 state Optional<bson::BSONObj> idObj;
713 state Reference<QueryContext> dcx;
714
715 Optional<IdInfo> encodedIds = extractEncodedIds(self->indexObj);
716
717 if (!encodedIds.present()) {
718 encodedId = DataValue(bson::OID::gen()).encode_key_part();
719 valueEncodedId = encodedId;
720 idObj = Optional<bson::BSONObj>();
721 dcx = cx->cx->getSubContext(encodedId);
722 } else {
723 encodedId = encodedIds.get().keyEncoded;
724 valueEncodedId = encodedIds.get().valueEncoded;
725 idObj = encodedIds.get().objValue;
726 dcx = cx->cx->getSubContext(encodedId);
727 Optional<DataValue> existing =
728 wait(dcx->get(DataValue(DocLayerConstants::ID_FIELD, DVTypeCode::STRING).encode_key_part()));
729 if (existing.present())
730 throw duplicated_key_field();
731 }
732
733 // FIXME: abstraction violation out of laziness
734 Key prefix = StringRef(dcx->getPrefix().toString());
735 dcx->getTransaction()->tr->addWriteConflictRange(KeyRangeRef(prefix, strinc(prefix)));
736
737 dcx->set(LiteralStringRef(""), DataValue::subObject().encode_value());
738
739 dcx->set(DataValue(DocLayerConstants::NS_FIELD, DVTypeCode::STRING).encode_key_part(),
740 DataValue(self->ns).encode_value());
741 dcx->set(
742 DataValue(DocLayerConstants::NAME_FIELD, DVTypeCode::STRING).encode_key_part(),
743 DataValue(self->indexObj.getStringField(DocLayerConstants::NAME_FIELD), DVTypeCode::STRING).encode_value());
744 dcx->set(DataValue(DocLayerConstants::KEY_FIELD, DVTypeCode::STRING).encode_key_part(),
745 DataValue(self->indexObj.getObjectField(DocLayerConstants::KEY_FIELD)).encode_value());
746 dcx->set(DataValue(DocLayerConstants::STATUS_FIELD, DVTypeCode::STRING).encode_key_part(),
747 DataValue(DocLayerConstants::INDEX_STATUS_BUILDING, DVTypeCode::STRING).encode_value());
748 dcx->set(DataValue(DocLayerConstants::METADATA_VERSION_FIELD, DVTypeCode::STRING).encode_key_part(),
749 DataValue(1).encode_value());
750 dcx->set(DataValue(DocLayerConstants::BUILD_ID_FIELD, DVTypeCode::STRING).encode_key_part(),
751 DataValue(self->build_id.toString()).encode_value());
752 dcx->set(DataValue(DocLayerConstants::UNIQUE_FIELD, DVTypeCode::STRING).encode_key_part(),
753 DataValue(self->indexObj.getBoolField(DocLayerConstants::UNIQUE_FIELD)).encode_value());
754 dcx->set(DataValue(DocLayerConstants::BACKGROUND_FIELD, DVTypeCode::STRING).encode_key_part(),
755 DataValue(self->indexObj.getBoolField(DocLayerConstants::BACKGROUND_FIELD)).encode_value());

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected