Skip to content

Commit

Permalink
allow operators =, *= and =* on note content
Browse files Browse the repository at this point in the history
  • Loading branch information
zadam committed May 11, 2022
1 parent 91d23c5 commit bf49648
Showing 1 changed file with 29 additions and 14 deletions.
43 changes: 29 additions & 14 deletions src/services/search/expressions/note_content_fulltext.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,17 @@ const protectedSessionService = require('../../protected_session');
const striptags = require('striptags');
const utils = require("../../utils");

const ALLOWED_OPERATORS = ['*=*', '=', '*=', '=*'];

class NoteContentFulltextExp extends Expression {
constructor(operator, {tokens, raw, flatText}) {
super();

if (operator !== '*=*') {
throw new Error(`Note content can be searched only with *=* operator`);
if (!ALLOWED_OPERATORS.includes(operator)) {
throw new Error(`Note content can be searched only with operators: ` + ALLOWED_OPERATORS.join(", "));
}

this.operator = operator;
this.tokens = tokens;
this.raw = !!raw;
this.flatText = !!flatText;
Expand Down Expand Up @@ -49,18 +52,30 @@ class NoteContentFulltextExp extends Expression {

content = this.preprocessContent(content, type, mime);

const nonMatchingToken = this.tokens.find(token =>
!content.includes(token) &&
(
// in case of default fulltext search we should consider both title, attrs and content
// so e.g. "hello world" should match when "hello" is in title and "world" in content
!this.flatText
|| !becca.notes[noteId].getFlatText().includes(token)
)
);

if (!nonMatchingToken) {
resultNoteSet.add(becca.notes[noteId]);
if (this.tokens.length === 1 && this.operator !== '*=*') {
const [token] = this.tokens;

if ((this.operator === '=' && token === content)
|| (this.operator === '*=' && content.endsWith(token))
|| (this.operator === '=*' && content.startsWith(token))) {

resultNoteSet.add(becca.notes[noteId]);
}
}
else {
const nonMatchingToken = this.tokens.find(token =>
!content.includes(token) &&
(
// in case of default fulltext search we should consider both title, attrs and content
// so e.g. "hello world" should match when "hello" is in title and "world" in content
!this.flatText
|| !becca.notes[noteId].getFlatText().includes(token)
)
);

if (!nonMatchingToken) {
resultNoteSet.add(becca.notes[noteId]);
}
}
}

Expand Down

0 comments on commit bf49648

Please sign in to comment.