Merge pull request #1003 from hcengineering/search_query_fix

Search query fix
This commit is contained in:
Andrey Sobolev 2022-02-14 16:20:39 +07:00 committed by GitHub
commit cb313f9b93
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 48 additions and 13 deletions

View File

@ -228,6 +228,15 @@ export class LiveQuery extends TxProcessor implements Client {
}
const pos = q.result.findIndex((p) => p._id === tx.objectId)
if (pos !== -1) {
// If query contains search we must check use fulltext
if (q.query.$search != null && q.query.$search.length > 0) {
const match = await this.findOne(q._class, { $search: q.query.$search, _id: tx.objectId }, q.options)
if (match === undefined) {
q.result.splice(pos, 1)
} else {
q.result[pos] = match
}
} else {
const updatedDoc = q.result[pos]
await this.__updateDoc(q, updatedDoc, tx)
if (!this.match(q, updatedDoc)) {
@ -235,8 +244,9 @@ export class LiveQuery extends TxProcessor implements Client {
} else {
q.result[pos] = updatedDoc
}
}
this.sort(q, tx)
await this.callback(updatedDoc, q)
await this.callback(q.result[pos], q)
} else if (this.matchQuery(q, tx)) {
return await this.refresh(q)
}
@ -383,6 +393,12 @@ export class LiveQuery extends TxProcessor implements Client {
// No need to update, document already in results.
return
}
// If query contains search we must check use fulltext
if (q.query.$search != null && q.query.$search.length > 0) {
const match = await this.findOne(q._class, { $search: q.query.$search, _id: doc._id }, q.options)
if (match === undefined) return
}
q.result.push(doc)
if (q.options?.sort !== undefined) {

View File

@ -16,17 +16,12 @@
<script lang="ts">
import type { Vacancy } from '@anticrm/recruit'
import recruit from '../plugin'
import { closeTooltip, Icon } from '@anticrm/ui'
import { Icon } from '@anticrm/ui'
import { showPanel } from '@anticrm/ui/src/panelup'
import { createEventDispatcher } from 'svelte'
export let value: Vacancy
const dispatch = createEventDispatcher()
function show () {
dispatch('click')
closeTooltip()
showPanel(recruit.component.EditVacancy, value._id, value._class, 'right')
}
</script>

View File

@ -28,6 +28,7 @@ import core, {
IndexKind,
MeasureContext,
Obj,
ObjQueryType,
PropertyType,
Ref,
Tx,
@ -148,7 +149,8 @@ export class FullTextIndex implements WithFind {
ids.add(doc.attachedTo)
}
}
return await this.dbStorage.findAll(ctx, _class, { _id: { $in: Array.from(ids) as any }, ...mainQuery }, options) // TODO: remove `as any`
const resultIds = getResultIds(ids, _id)
return await this.dbStorage.findAll(ctx, _class, { _id: { $in: resultIds }, ...mainQuery }, options)
}
private getFullTextAttributes (clazz: Ref<Class<Obj>>, parentDoc?: Doc): AnyAttribute[] {
@ -309,3 +311,25 @@ function isFullTextAttribute (attr: AnyAttribute): boolean {
(attr.type._class === core.class.TypeString || attr.type._class === core.class.TypeMarkup)
)
}
function getResultIds (ids: Set<Ref<Doc>>, _id: ObjQueryType<Ref<Doc>> | undefined): Ref<Doc>[] {
let result = []
if (_id !== undefined) {
if (typeof _id === 'string') {
if (!ids.has(_id)) {
return []
} else {
result = [_id]
}
} else if (_id.$in !== undefined) {
for (const id of _id.$in) {
if (ids.has(id)) {
result.push(id)
}
}
}
} else {
result = Array.from(ids)
}
return result
}