internal static async Task <DocumentLookupResult> LookupDocumentAsync(ICouchbaseCollection collection, string docId, TimeSpan?keyValueTimeout, bool fullDocument = true)
        {
            var specs = new List <LookupInSpec>()
            {
                LookupInSpec.Get(TransactionFields.TransactionInterfacePrefixOnly, isXattr: true),
                LookupInSpec.Get("$document", isXattr: true),
                LookupInSpec.Get(TransactionFields.StagedData, isXattr: true)
            };

            var opts = new LookupInOptions().Defaults(keyValueTimeout).AccessDeleted(true);

            int?txnIndex        = 0;
            int docMetaIndex    = 1;
            int?stagedDataIndex = 2;

            int?fullDocIndex = null;

            if (fullDocument)
            {
                specs.Add(LookupInSpec.GetFull());
                fullDocIndex = specs.Count - 1;
            }

            ILookupInResult lookupInResult;

            try
            {
                lookupInResult = await collection.LookupInAsync(docId, specs, opts).CAF();
            }
            catch (PathInvalidException)
            {
                throw;
            }

            var docMeta = lookupInResult.ContentAs <DocumentMetadata>(docMetaIndex);

            IContentAsWrapper?unstagedContent = fullDocIndex.HasValue
                ? new LookupInContentAsWrapper(lookupInResult, fullDocIndex.Value)
                : null;

            var stagedContent = stagedDataIndex.HasValue && lookupInResult.Exists(stagedDataIndex.Value)
                ? new LookupInContentAsWrapper(lookupInResult, stagedDataIndex.Value)
                : null;

            var result = new DocumentLookupResult(docId,
                                                  unstagedContent,
                                                  stagedContent,
                                                  lookupInResult,
                                                  docMeta,
                                                  collection);

            if (txnIndex.HasValue && lookupInResult.Exists(txnIndex.Value))
            {
                result.TransactionXattrs = lookupInResult.ContentAs <TransactionXattrs>(txnIndex.Value);
            }

            return(result);
        }
 public void Add(ICouchbaseCollection collection, string docId, DocumentLookupResult doc) => Docs.Add(collection.GetKey(docId), doc);