From a7bec96320fdffb8b2d600f2d0cee0b81275947a Mon Sep 17 00:00:00 2001
From: Vyacheslav Tumanov <me@slavatumanov.me>
Date: Tue, 25 Jun 2024 10:01:14 +0500
Subject: [PATCH] digest attribute fix (#5914)

Signed-off-by: Vyacheslav Tumanov <me@slavatumanov.me>
---
 packages/core/src/utils.ts                   | 13 +++++++++++--
 server-plugins/collaboration/src/fulltext.ts |  3 +--
 server/core/src/indexer/content.ts           |  3 +--
 server/core/src/indexer/fulltextPush.ts      |  4 ++--
 4 files changed, 15 insertions(+), 8 deletions(-)

diff --git a/packages/core/src/utils.ts b/packages/core/src/utils.ts
index 4e7e5bdb9e..f2bcb9917e 100644
--- a/packages/core/src/utils.ts
+++ b/packages/core/src/utils.ts
@@ -158,6 +158,7 @@ export interface IndexKeyOptions {
   _class?: Ref<Class<Obj>>
   docId?: Ref<DocIndexState>
   extra?: string[]
+  digest?: boolean
 }
 /**
  * @public
@@ -171,7 +172,8 @@ export function docUpdKey (name: string, opt?: IndexKeyOptions): string {
  */
 export function docKey (name: string, opt?: IndexKeyOptions): string {
   const extra = opt?.extra !== undefined && opt?.extra?.length > 0 ? `#${opt.extra?.join('#') ?? ''}` : ''
-  return opt?._class === undefined ? name : `${opt?._class}%${name}${extra}`
+  const digestName = opt?.digest === true ? name + '^digest' : name
+  return opt?._class === undefined ? digestName : `${opt?._class}%${digestName}${extra}`
 }
 
 /**
@@ -182,6 +184,7 @@ export function extractDocKey (key: string): {
   attr: string
   docId?: Ref<DocIndexState>
   extra: string[]
+  digest: boolean
 } {
   let k = key
   if (k.startsWith(attributesPrefix)) {
@@ -204,8 +207,14 @@ export function extractDocKey (key: string): {
   }
   const extra = attr.split('#')
   attr = extra.splice(0, 1)[0]
+  const digestPos = attr.indexOf('^digest')
+  let digest = false
+  if (digestPos !== -1) {
+    attr = attr.substring(0, digestPos)
+    digest = true
+  }
 
-  return { docId, attr, _class, extra }
+  return { docId, attr, _class, extra, digest }
 }
 
 /**
diff --git a/server-plugins/collaboration/src/fulltext.ts b/server-plugins/collaboration/src/fulltext.ts
index a49a812aab..9560271f9c 100644
--- a/server-plugins/collaboration/src/fulltext.ts
+++ b/server-plugins/collaboration/src/fulltext.ts
@@ -49,7 +49,6 @@ export class CollaborativeContentRetrievalStage implements FullTextPipelineStage
   stageId = contentStageId
 
   extra = ['content', 'base64']
-  digest = '^digest'
 
   enabled = true
 
@@ -111,7 +110,7 @@ export class CollaborativeContentRetrievalStage implements FullTextPipelineStage
 
             if (docInfo !== undefined) {
               const digest = docInfo.etag
-              const digestKey = docKey(val.name + this.digest, { _class: val.attributeOf })
+              const digestKey = docKey(val.name, { _class: val.attributeOf, digest: true })
               if (doc.attributes[digestKey] !== digest) {
                 ;(update as any)[docUpdKey(digestKey)] = digest
 
diff --git a/server/core/src/indexer/content.ts b/server/core/src/indexer/content.ts
index 6bba3e10f1..079a4892c0 100644
--- a/server/core/src/indexer/content.ts
+++ b/server/core/src/indexer/content.ts
@@ -46,7 +46,6 @@ export class ContentRetrievalStage implements FullTextPipelineStage {
   stageId = contentStageId
 
   extra = ['content', 'base64']
-  digest = '^digest'
 
   enabled = true
 
@@ -110,7 +109,7 @@ export class ContentRetrievalStage implements FullTextPipelineStage {
 
               if (!contentType.includes('image')) {
                 const digest = docInfo.etag
-                const digestKey = docKey(val.name + this.digest, { _class: val.attributeOf })
+                const digestKey = docKey(val.name, { _class: val.attributeOf, digest: true })
                 if (doc.attributes[digestKey] !== digest) {
                   ;(update as any)[docUpdKey(digestKey)] = digest
 
diff --git a/server/core/src/indexer/fulltextPush.ts b/server/core/src/indexer/fulltextPush.ts
index 8fd60cdb38..0ceb29e800 100644
--- a/server/core/src/indexer/fulltextPush.ts
+++ b/server/core/src/indexer/fulltextPush.ts
@@ -257,7 +257,7 @@ function updateDoc2Elastic (
     if (v == null) {
       continue
     }
-    let { _class, attr, docId, extra } = extractDocKey(k)
+    let { _class, attr, docId, extra, digest } = extractDocKey(k)
     if (attr.length === 0) {
       continue
     }
@@ -302,7 +302,7 @@ function updateDoc2Elastic (
       }
       continue
     }
-    const docIdAttr = docKey(attr, { _class, extra: extra.filter((it) => it !== 'base64') })
+    const docIdAttr = docKey(attr, { _class, extra: extra.filter((it) => it !== 'base64'), digest })
     if (vv !== null) {
       // Since we replace array of values, we could ignore null
       doc[docIdAttr] =