mirror of
				https://github.com/zadam/trilium.git
				synced 2025-10-31 10:26:08 +01:00 
			
		
		
		
	Merge branch 'develop' of https://github.com/TriliumNext/Notes into develop
This commit is contained in:
		| @@ -4,14 +4,14 @@ import BAttribute from "../../src/becca/entities/battribute.js"; | |||||||
| import becca from "../../src/becca/becca.js"; | import becca from "../../src/becca/becca.js"; | ||||||
| import randtoken from "rand-token"; | import randtoken from "rand-token"; | ||||||
| import type SearchResult from "../../src/services/search/search_result.js"; | import type SearchResult from "../../src/services/search/search_result.js"; | ||||||
| import type { NoteType } from "../../src/becca/entities/rows.js"; | import type { NoteRow, NoteType } from "../../src/becca/entities/rows.js"; | ||||||
| randtoken.generator({ source: "crypto" }); | randtoken.generator({ source: "crypto" }); | ||||||
|  |  | ||||||
| function findNoteByTitle(searchResults: Array<SearchResult>, title: string): BNote | undefined { | export function findNoteByTitle(searchResults: Array<SearchResult>, title: string): BNote | undefined { | ||||||
|     return searchResults.map((sr) => becca.notes[sr.noteId]).find((note) => note.title === title); |     return searchResults.map((sr) => becca.notes[sr.noteId]).find((note) => note.title === title); | ||||||
| } | } | ||||||
|  |  | ||||||
| class NoteBuilder { | export class NoteBuilder { | ||||||
|     note: BNote; |     note: BNote; | ||||||
|     constructor(note: BNote) { |     constructor(note: BNote) { | ||||||
|         this.note = note; |         this.note = note; | ||||||
| @@ -55,11 +55,11 @@ class NoteBuilder { | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
| function id() { | export function id() { | ||||||
|     return randtoken.generate(10); |     return randtoken.generate(10); | ||||||
| } | } | ||||||
|  |  | ||||||
| function note(title: string, extraParams = {}) { | export function note(title: string, extraParams: Partial<NoteRow> = {}) { | ||||||
|     const row = Object.assign( |     const row = Object.assign( | ||||||
|         { |         { | ||||||
|             noteId: id(), |             noteId: id(), | ||||||
| @@ -74,9 +74,3 @@ function note(title: string, extraParams = {}) { | |||||||
|  |  | ||||||
|     return new NoteBuilder(note); |     return new NoteBuilder(note); | ||||||
| } | } | ||||||
|  |  | ||||||
| export default { |  | ||||||
|     NoteBuilder, |  | ||||||
|     findNoteByTitle, |  | ||||||
|     note |  | ||||||
| }; |  | ||||||
|   | |||||||
| @@ -5,7 +5,7 @@ import BBranch from "../../../becca/entities/bbranch.js"; | |||||||
| import SearchContext from "../search_context.js"; | import SearchContext from "../search_context.js"; | ||||||
| import dateUtils from "../../date_utils.js"; | import dateUtils from "../../date_utils.js"; | ||||||
| import becca from "../../../becca/becca.js"; | import becca from "../../../becca/becca.js"; | ||||||
| import becca_mocking from "../../../../spec/support/becca_mocking.js"; | import { findNoteByTitle, note, NoteBuilder } from "../../../../spec/support/becca_mocking.js"; | ||||||
|  |  | ||||||
| describe("Search", () => { | describe("Search", () => { | ||||||
|     let rootNote: any; |     let rootNote: any; | ||||||
| @@ -13,7 +13,7 @@ describe("Search", () => { | |||||||
|     beforeEach(() => { |     beforeEach(() => { | ||||||
|         becca.reset(); |         becca.reset(); | ||||||
|  |  | ||||||
|         rootNote = new becca_mocking.NoteBuilder(new BNote({ noteId: "root", title: "root", type: "text" })); |         rootNote = new NoteBuilder(new BNote({ noteId: "root", title: "root", type: "text" })); | ||||||
|         new BBranch({ |         new BBranch({ | ||||||
|             branchId: "none_root", |             branchId: "none_root", | ||||||
|             noteId: "root", |             noteId: "root", | ||||||
| @@ -23,18 +23,18 @@ describe("Search", () => { | |||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     it.skip("simple path match", () => { |     it.skip("simple path match", () => { | ||||||
|         rootNote.child(becca_mocking.note("Europe").child(becca_mocking.note("Austria"))); |         rootNote.child(note("Europe").child(note("Austria"))); | ||||||
|  |  | ||||||
|         const searchContext = new SearchContext(); |         const searchContext = new SearchContext(); | ||||||
|         const searchResults = searchService.findResultsWithQuery("europe austria", searchContext); |         const searchResults = searchService.findResultsWithQuery("europe austria", searchContext); | ||||||
|  |  | ||||||
|         expect(searchResults.length).toEqual(1); |         expect(searchResults.length).toEqual(1); | ||||||
|         expect(becca_mocking.findNoteByTitle(searchResults, "Austria")).toBeTruthy(); |         expect(findNoteByTitle(searchResults, "Austria")).toBeTruthy(); | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     it.skip("normal search looks also at attributes", () => { |     it.skip("normal search looks also at attributes", () => { | ||||||
|         const austria = becca_mocking.note("Austria"); |         const austria = note("Austria"); | ||||||
|         const vienna = becca_mocking.note("Vienna"); |         const vienna = note("Vienna"); | ||||||
|  |  | ||||||
|         rootNote.child(austria.relation("capital", vienna.note)).child(vienna.label("inhabitants", "1888776")); |         rootNote.child(austria.relation("capital", vienna.note)).child(vienna.label("inhabitants", "1888776")); | ||||||
|  |  | ||||||
| @@ -42,27 +42,27 @@ describe("Search", () => { | |||||||
|         let searchResults = searchService.findResultsWithQuery("capital", searchContext); |         let searchResults = searchService.findResultsWithQuery("capital", searchContext); | ||||||
|  |  | ||||||
|         expect(searchResults.length).toEqual(1); |         expect(searchResults.length).toEqual(1); | ||||||
|         expect(becca_mocking.findNoteByTitle(searchResults, "Austria")).toBeTruthy(); |         expect(findNoteByTitle(searchResults, "Austria")).toBeTruthy(); | ||||||
|  |  | ||||||
|         searchResults = searchService.findResultsWithQuery("inhabitants", searchContext); |         searchResults = searchService.findResultsWithQuery("inhabitants", searchContext); | ||||||
|  |  | ||||||
|         expect(searchResults.length).toEqual(1); |         expect(searchResults.length).toEqual(1); | ||||||
|         expect(becca_mocking.findNoteByTitle(searchResults, "Vienna")).toBeTruthy(); |         expect(findNoteByTitle(searchResults, "Vienna")).toBeTruthy(); | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     it.skip("normal search looks also at type and mime", () => { |     it.skip("normal search looks also at type and mime", () => { | ||||||
|         rootNote.child(becca_mocking.note("Effective Java", { type: "book", mime: "" })).child(becca_mocking.note("Hello World.java", { type: "code", mime: "text/x-java" })); |         rootNote.child(note("Effective Java", { type: "book", mime: "" })).child(note("Hello World.java", { type: "code", mime: "text/x-java" })); | ||||||
|  |  | ||||||
|         const searchContext = new SearchContext(); |         const searchContext = new SearchContext(); | ||||||
|         let searchResults = searchService.findResultsWithQuery("book", searchContext); |         let searchResults = searchService.findResultsWithQuery("book", searchContext); | ||||||
|  |  | ||||||
|         expect(searchResults.length).toEqual(1); |         expect(searchResults.length).toEqual(1); | ||||||
|         expect(becca_mocking.findNoteByTitle(searchResults, "Effective Java")).toBeTruthy(); |         expect(findNoteByTitle(searchResults, "Effective Java")).toBeTruthy(); | ||||||
|  |  | ||||||
|         searchResults = searchService.findResultsWithQuery("text", searchContext); // should match mime |         searchResults = searchService.findResultsWithQuery("text", searchContext); // should match mime | ||||||
|  |  | ||||||
|         expect(searchResults.length).toEqual(1); |         expect(searchResults.length).toEqual(1); | ||||||
|         expect(becca_mocking.findNoteByTitle(searchResults, "Hello World.java")).toBeTruthy(); |         expect(findNoteByTitle(searchResults, "Hello World.java")).toBeTruthy(); | ||||||
|  |  | ||||||
|         searchResults = searchService.findResultsWithQuery("java", searchContext); |         searchResults = searchService.findResultsWithQuery("java", searchContext); | ||||||
|  |  | ||||||
| @@ -70,110 +70,104 @@ describe("Search", () => { | |||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     it.skip("only end leafs are results", () => { |     it.skip("only end leafs are results", () => { | ||||||
|         rootNote.child(becca_mocking.note("Europe").child(becca_mocking.note("Austria"))); |         rootNote.child(note("Europe").child(note("Austria"))); | ||||||
|  |  | ||||||
|         const searchContext = new SearchContext(); |         const searchContext = new SearchContext(); | ||||||
|         const searchResults = searchService.findResultsWithQuery("europe", searchContext); |         const searchResults = searchService.findResultsWithQuery("europe", searchContext); | ||||||
|  |  | ||||||
|         expect(searchResults.length).toEqual(1); |         expect(searchResults.length).toEqual(1); | ||||||
|         expect(becca_mocking.findNoteByTitle(searchResults, "Europe")).toBeTruthy(); |         expect(findNoteByTitle(searchResults, "Europe")).toBeTruthy(); | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     it.skip("only end leafs are results", () => { |     it.skip("only end leafs are results", () => { | ||||||
|         rootNote.child(becca_mocking.note("Europe").child(becca_mocking.note("Austria").label("capital", "Vienna"))); |         rootNote.child(note("Europe").child(note("Austria").label("capital", "Vienna"))); | ||||||
|  |  | ||||||
|         const searchContext = new SearchContext(); |         const searchContext = new SearchContext(); | ||||||
|  |  | ||||||
|         const searchResults = searchService.findResultsWithQuery("Vienna", searchContext); |         const searchResults = searchService.findResultsWithQuery("Vienna", searchContext); | ||||||
|         expect(searchResults.length).toEqual(1); |         expect(searchResults.length).toEqual(1); | ||||||
|         expect(becca_mocking.findNoteByTitle(searchResults, "Austria")).toBeTruthy(); |         expect(findNoteByTitle(searchResults, "Austria")).toBeTruthy(); | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     it("label comparison with short syntax", () => { |     it("label comparison with short syntax", () => { | ||||||
|         rootNote.child(becca_mocking.note("Europe").child(becca_mocking.note("Austria").label("capital", "Vienna")).child(becca_mocking.note("Czech Republic").label("capital", "Prague"))); |         rootNote.child(note("Europe").child(note("Austria").label("capital", "Vienna")).child(note("Czech Republic").label("capital", "Prague"))); | ||||||
|  |  | ||||||
|         const searchContext = new SearchContext(); |         const searchContext = new SearchContext(); | ||||||
|  |  | ||||||
|         let searchResults = searchService.findResultsWithQuery("#capital=Vienna", searchContext); |         let searchResults = searchService.findResultsWithQuery("#capital=Vienna", searchContext); | ||||||
|         expect(searchResults.length).toEqual(1); |         expect(searchResults.length).toEqual(1); | ||||||
|         expect(becca_mocking.findNoteByTitle(searchResults, "Austria")).toBeTruthy(); |         expect(findNoteByTitle(searchResults, "Austria")).toBeTruthy(); | ||||||
|  |  | ||||||
|         // case sensitivity: |         // case sensitivity: | ||||||
|         searchResults = searchService.findResultsWithQuery("#CAPITAL=VIENNA", searchContext); |         searchResults = searchService.findResultsWithQuery("#CAPITAL=VIENNA", searchContext); | ||||||
|         expect(searchResults.length).toEqual(1); |         expect(searchResults.length).toEqual(1); | ||||||
|         expect(becca_mocking.findNoteByTitle(searchResults, "Austria")).toBeTruthy(); |         expect(findNoteByTitle(searchResults, "Austria")).toBeTruthy(); | ||||||
|  |  | ||||||
|         searchResults = searchService.findResultsWithQuery("#caPItal=vienNa", searchContext); |         searchResults = searchService.findResultsWithQuery("#caPItal=vienNa", searchContext); | ||||||
|         expect(searchResults.length).toEqual(1); |         expect(searchResults.length).toEqual(1); | ||||||
|         expect(becca_mocking.findNoteByTitle(searchResults, "Austria")).toBeTruthy(); |         expect(findNoteByTitle(searchResults, "Austria")).toBeTruthy(); | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     it("label comparison with full syntax", () => { |     it("label comparison with full syntax", () => { | ||||||
|         rootNote.child(becca_mocking.note("Europe").child(becca_mocking.note("Austria").label("capital", "Vienna")).child(becca_mocking.note("Czech Republic").label("capital", "Prague"))); |         rootNote.child(note("Europe").child(note("Austria").label("capital", "Vienna")).child(note("Czech Republic").label("capital", "Prague"))); | ||||||
|  |  | ||||||
|         const searchContext = new SearchContext(); |         const searchContext = new SearchContext(); | ||||||
|  |  | ||||||
|         let searchResults = searchService.findResultsWithQuery("# note.labels.capital=Prague", searchContext); |         let searchResults = searchService.findResultsWithQuery("# note.labels.capital=Prague", searchContext); | ||||||
|         expect(searchResults.length).toEqual(1); |         expect(searchResults.length).toEqual(1); | ||||||
|         expect(becca_mocking.findNoteByTitle(searchResults, "Czech Republic")).toBeTruthy(); |         expect(findNoteByTitle(searchResults, "Czech Republic")).toBeTruthy(); | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     it("numeric label comparison", () => { |     it("numeric label comparison", () => { | ||||||
|         rootNote.child( |         rootNote.child(note("Europe") | ||||||
|             becca_mocking |  | ||||||
|                 .note("Europe") |  | ||||||
|                 .label("country", "", true) |                 .label("country", "", true) | ||||||
|                 .child(becca_mocking.note("Austria").label("population", "8859000")) |                 .child(note("Austria").label("population", "8859000")) | ||||||
|                 .child(becca_mocking.note("Czech Republic").label("population", "10650000")) |                 .child(note("Czech Republic").label("population", "10650000")) | ||||||
|         ); |         ); | ||||||
|  |  | ||||||
|         const searchContext = new SearchContext(); |         const searchContext = new SearchContext(); | ||||||
|  |  | ||||||
|         const searchResults = searchService.findResultsWithQuery("#country #population >= 10000000", searchContext); |         const searchResults = searchService.findResultsWithQuery("#country #population >= 10000000", searchContext); | ||||||
|         expect(searchResults.length).toEqual(1); |         expect(searchResults.length).toEqual(1); | ||||||
|         expect(becca_mocking.findNoteByTitle(searchResults, "Czech Republic")).toBeTruthy(); |         expect(findNoteByTitle(searchResults, "Czech Republic")).toBeTruthy(); | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     it.skip("inherited label comparison", () => { |     it.skip("inherited label comparison", () => { | ||||||
|         rootNote.child(becca_mocking.note("Europe").label("country", "", true).child(becca_mocking.note("Austria")).child(becca_mocking.note("Czech Republic"))); |         rootNote.child(note("Europe").label("country", "", true).child(note("Austria")).child(note("Czech Republic"))); | ||||||
|  |  | ||||||
|         const searchContext = new SearchContext(); |         const searchContext = new SearchContext(); | ||||||
|  |  | ||||||
|         const searchResults = searchService.findResultsWithQuery("austria #country", searchContext); |         const searchResults = searchService.findResultsWithQuery("austria #country", searchContext); | ||||||
|         expect(searchResults.length).toEqual(1); |         expect(searchResults.length).toEqual(1); | ||||||
|         expect(becca_mocking.findNoteByTitle(searchResults, "Austria")).toBeTruthy(); |         expect(findNoteByTitle(searchResults, "Austria")).toBeTruthy(); | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     it("numeric label comparison fallback to string comparison", () => { |     it("numeric label comparison fallback to string comparison", () => { | ||||||
|         // dates should not be coerced into numbers which would then give wrong numbers |         // dates should not be coerced into numbers which would then give wrong numbers | ||||||
|  |  | ||||||
|         rootNote.child( |         rootNote.child(note("Europe") | ||||||
|             becca_mocking |  | ||||||
|                 .note("Europe") |  | ||||||
|                 .label("country", "", true) |                 .label("country", "", true) | ||||||
|                 .child(becca_mocking.note("Austria").label("established", "1955-07-27")) |                 .child(note("Austria").label("established", "1955-07-27")) | ||||||
|                 .child(becca_mocking.note("Czech Republic").label("established", "1993-01-01")) |                 .child(note("Czech Republic").label("established", "1993-01-01")) | ||||||
|                 .child(becca_mocking.note("Hungary").label("established", "1920-06-04")) |                 .child(note("Hungary").label("established", "1920-06-04")) | ||||||
|         ); |         ); | ||||||
|  |  | ||||||
|         const searchContext = new SearchContext(); |         const searchContext = new SearchContext(); | ||||||
|  |  | ||||||
|         let searchResults = searchService.findResultsWithQuery('#established <= "1955-01-01"', searchContext); |         let searchResults = searchService.findResultsWithQuery('#established <= "1955-01-01"', searchContext); | ||||||
|         expect(searchResults.length).toEqual(1); |         expect(searchResults.length).toEqual(1); | ||||||
|         expect(becca_mocking.findNoteByTitle(searchResults, "Hungary")).toBeTruthy(); |         expect(findNoteByTitle(searchResults, "Hungary")).toBeTruthy(); | ||||||
|  |  | ||||||
|         searchResults = searchService.findResultsWithQuery('#established > "1955-01-01"', searchContext); |         searchResults = searchService.findResultsWithQuery('#established > "1955-01-01"', searchContext); | ||||||
|         expect(searchResults.length).toEqual(2); |         expect(searchResults.length).toEqual(2); | ||||||
|         expect(becca_mocking.findNoteByTitle(searchResults, "Austria")).toBeTruthy(); |         expect(findNoteByTitle(searchResults, "Austria")).toBeTruthy(); | ||||||
|         expect(becca_mocking.findNoteByTitle(searchResults, "Czech Republic")).toBeTruthy(); |         expect(findNoteByTitle(searchResults, "Czech Republic")).toBeTruthy(); | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     it("smart date comparisons", () => { |     it("smart date comparisons", () => { | ||||||
|         // dates should not be coerced into numbers which would then give wrong numbers |         // dates should not be coerced into numbers which would then give wrong numbers | ||||||
|  |  | ||||||
|         rootNote.child( |         rootNote.child(note("My note", { dateCreated: dateUtils.localNowDateTime() }) | ||||||
|             becca_mocking |  | ||||||
|                 .note("My note", { dateCreated: dateUtils.localNowDateTime() }) |  | ||||||
|                 .label("year", new Date().getFullYear().toString()) |                 .label("year", new Date().getFullYear().toString()) | ||||||
|                 .label("month", dateUtils.localNowDate().substr(0, 7)) |                 .label("month", dateUtils.localNowDate().substr(0, 7)) | ||||||
|                 .label("date", dateUtils.localNowDate()) |                 .label("date", dateUtils.localNowDate()) | ||||||
| @@ -188,7 +182,7 @@ describe("Search", () => { | |||||||
|                 .toEqual(expectedResultCount); |                 .toEqual(expectedResultCount); | ||||||
|  |  | ||||||
|             if (expectedResultCount === 1) { |             if (expectedResultCount === 1) { | ||||||
|                 expect(becca_mocking.findNoteByTitle(searchResults, "My note")).toBeTruthy(); |                 expect(findNoteByTitle(searchResults, "My note")).toBeTruthy(); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
| @@ -225,30 +219,26 @@ describe("Search", () => { | |||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     it("logical or", () => { |     it("logical or", () => { | ||||||
|         rootNote.child( |         rootNote.child(note("Europe") | ||||||
|             becca_mocking |  | ||||||
|                 .note("Europe") |  | ||||||
|                 .label("country", "", true) |                 .label("country", "", true) | ||||||
|                 .child(becca_mocking.note("Austria").label("languageFamily", "germanic")) |                 .child(note("Austria").label("languageFamily", "germanic")) | ||||||
|                 .child(becca_mocking.note("Czech Republic").label("languageFamily", "slavic")) |                 .child(note("Czech Republic").label("languageFamily", "slavic")) | ||||||
|                 .child(becca_mocking.note("Hungary").label("languageFamily", "finnougric")) |                 .child(note("Hungary").label("languageFamily", "finnougric")) | ||||||
|         ); |         ); | ||||||
|  |  | ||||||
|         const searchContext = new SearchContext(); |         const searchContext = new SearchContext(); | ||||||
|  |  | ||||||
|         const searchResults = searchService.findResultsWithQuery("#languageFamily = slavic OR #languageFamily = germanic", searchContext); |         const searchResults = searchService.findResultsWithQuery("#languageFamily = slavic OR #languageFamily = germanic", searchContext); | ||||||
|         expect(searchResults.length).toEqual(2); |         expect(searchResults.length).toEqual(2); | ||||||
|         expect(becca_mocking.findNoteByTitle(searchResults, "Czech Republic")).toBeTruthy(); |         expect(findNoteByTitle(searchResults, "Czech Republic")).toBeTruthy(); | ||||||
|         expect(becca_mocking.findNoteByTitle(searchResults, "Austria")).toBeTruthy(); |         expect(findNoteByTitle(searchResults, "Austria")).toBeTruthy(); | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     it("fuzzy attribute search", () => { |     it("fuzzy attribute search", () => { | ||||||
|         rootNote.child( |         rootNote.child(note("Europe") | ||||||
|             becca_mocking |  | ||||||
|                 .note("Europe") |  | ||||||
|                 .label("country", "", true) |                 .label("country", "", true) | ||||||
|                 .child(becca_mocking.note("Austria").label("languageFamily", "germanic")) |                 .child(note("Austria").label("languageFamily", "germanic")) | ||||||
|                 .child(becca_mocking.note("Czech Republic").label("languageFamily", "slavic")) |                 .child(note("Czech Republic").label("languageFamily", "slavic")) | ||||||
|         ); |         ); | ||||||
|  |  | ||||||
|         let searchContext = new SearchContext({ fuzzyAttributeSearch: false }); |         let searchContext = new SearchContext({ fuzzyAttributeSearch: false }); | ||||||
| @@ -266,147 +256,135 @@ describe("Search", () => { | |||||||
|  |  | ||||||
|         searchResults = searchService.findResultsWithQuery("#languageFamily=ger", searchContext); |         searchResults = searchService.findResultsWithQuery("#languageFamily=ger", searchContext); | ||||||
|         expect(searchResults.length).toEqual(1); |         expect(searchResults.length).toEqual(1); | ||||||
|         expect(becca_mocking.findNoteByTitle(searchResults, "Austria")).toBeTruthy(); |         expect(findNoteByTitle(searchResults, "Austria")).toBeTruthy(); | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     it("filter by note property", () => { |     it("filter by note property", () => { | ||||||
|         rootNote.child(becca_mocking.note("Europe").child(becca_mocking.note("Austria")).child(becca_mocking.note("Czech Republic"))); |         rootNote.child(note("Europe").child(note("Austria")).child(note("Czech Republic"))); | ||||||
|  |  | ||||||
|         const searchContext = new SearchContext(); |         const searchContext = new SearchContext(); | ||||||
|  |  | ||||||
|         const searchResults = searchService.findResultsWithQuery("# note.title =* czech", searchContext); |         const searchResults = searchService.findResultsWithQuery("# note.title =* czech", searchContext); | ||||||
|         expect(searchResults.length).toEqual(1); |         expect(searchResults.length).toEqual(1); | ||||||
|         expect(becca_mocking.findNoteByTitle(searchResults, "Czech Republic")).toBeTruthy(); |         expect(findNoteByTitle(searchResults, "Czech Republic")).toBeTruthy(); | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     it("filter by note's parent", () => { |     it("filter by note's parent", () => { | ||||||
|         rootNote |         rootNote | ||||||
|             .child( |             .child(note("Europe") | ||||||
|                 becca_mocking |                     .child(note("Austria")) | ||||||
|                     .note("Europe") |                     .child(note("Czech Republic").child(note("Prague"))) | ||||||
|                     .child(becca_mocking.note("Austria")) |  | ||||||
|                     .child(becca_mocking.note("Czech Republic").child(becca_mocking.note("Prague"))) |  | ||||||
|             ) |             ) | ||||||
|             .child(becca_mocking.note("Asia").child(becca_mocking.note("Taiwan"))); |             .child(note("Asia").child(note("Taiwan"))); | ||||||
|  |  | ||||||
|         const searchContext = new SearchContext(); |         const searchContext = new SearchContext(); | ||||||
|  |  | ||||||
|         let searchResults = searchService.findResultsWithQuery("# note.parents.title = Europe", searchContext); |         let searchResults = searchService.findResultsWithQuery("# note.parents.title = Europe", searchContext); | ||||||
|         expect(searchResults.length).toEqual(2); |         expect(searchResults.length).toEqual(2); | ||||||
|         expect(becca_mocking.findNoteByTitle(searchResults, "Austria")).toBeTruthy(); |         expect(findNoteByTitle(searchResults, "Austria")).toBeTruthy(); | ||||||
|         expect(becca_mocking.findNoteByTitle(searchResults, "Czech Republic")).toBeTruthy(); |         expect(findNoteByTitle(searchResults, "Czech Republic")).toBeTruthy(); | ||||||
|  |  | ||||||
|         searchResults = searchService.findResultsWithQuery("# note.parents.title = Asia", searchContext); |         searchResults = searchService.findResultsWithQuery("# note.parents.title = Asia", searchContext); | ||||||
|         expect(searchResults.length).toEqual(1); |         expect(searchResults.length).toEqual(1); | ||||||
|         expect(becca_mocking.findNoteByTitle(searchResults, "Taiwan")).toBeTruthy(); |         expect(findNoteByTitle(searchResults, "Taiwan")).toBeTruthy(); | ||||||
|  |  | ||||||
|         searchResults = searchService.findResultsWithQuery("# note.parents.parents.title = Europe", searchContext); |         searchResults = searchService.findResultsWithQuery("# note.parents.parents.title = Europe", searchContext); | ||||||
|         expect(searchResults.length).toEqual(1); |         expect(searchResults.length).toEqual(1); | ||||||
|         expect(becca_mocking.findNoteByTitle(searchResults, "Prague")).toBeTruthy(); |         expect(findNoteByTitle(searchResults, "Prague")).toBeTruthy(); | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     it("filter by note's ancestor", () => { |     it("filter by note's ancestor", () => { | ||||||
|         rootNote |         rootNote | ||||||
|             .child( |             .child(note("Europe") | ||||||
|                 becca_mocking |                     .child(note("Austria")) | ||||||
|                     .note("Europe") |                     .child(note("Czech Republic").child(note("Prague").label("city"))) | ||||||
|                     .child(becca_mocking.note("Austria")) |  | ||||||
|                     .child(becca_mocking.note("Czech Republic").child(becca_mocking.note("Prague").label("city"))) |  | ||||||
|             ) |             ) | ||||||
|             .child(becca_mocking.note("Asia").child(becca_mocking.note("Taiwan").child(becca_mocking.note("Taipei").label("city")))); |             .child(note("Asia").child(note("Taiwan").child(note("Taipei").label("city")))); | ||||||
|  |  | ||||||
|         const searchContext = new SearchContext(); |         const searchContext = new SearchContext(); | ||||||
|  |  | ||||||
|         let searchResults = searchService.findResultsWithQuery("#city AND note.ancestors.title = Europe", searchContext); |         let searchResults = searchService.findResultsWithQuery("#city AND note.ancestors.title = Europe", searchContext); | ||||||
|         expect(searchResults.length).toEqual(1); |         expect(searchResults.length).toEqual(1); | ||||||
|         expect(becca_mocking.findNoteByTitle(searchResults, "Prague")).toBeTruthy(); |         expect(findNoteByTitle(searchResults, "Prague")).toBeTruthy(); | ||||||
|  |  | ||||||
|         searchResults = searchService.findResultsWithQuery("#city AND note.ancestors.title = Asia", searchContext); |         searchResults = searchService.findResultsWithQuery("#city AND note.ancestors.title = Asia", searchContext); | ||||||
|         expect(searchResults.length).toEqual(1); |         expect(searchResults.length).toEqual(1); | ||||||
|         expect(becca_mocking.findNoteByTitle(searchResults, "Taipei")).toBeTruthy(); |         expect(findNoteByTitle(searchResults, "Taipei")).toBeTruthy(); | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     it("filter by note's child", () => { |     it("filter by note's child", () => { | ||||||
|         rootNote |         rootNote | ||||||
|             .child( |             .child(note("Europe") | ||||||
|                 becca_mocking |                     .child(note("Austria").child(note("Vienna"))) | ||||||
|                     .note("Europe") |                     .child(note("Czech Republic").child(note("Prague"))) | ||||||
|                     .child(becca_mocking.note("Austria").child(becca_mocking.note("Vienna"))) |  | ||||||
|                     .child(becca_mocking.note("Czech Republic").child(becca_mocking.note("Prague"))) |  | ||||||
|             ) |             ) | ||||||
|             .child(becca_mocking.note("Oceania").child(becca_mocking.note("Australia"))); |             .child(note("Oceania").child(note("Australia"))); | ||||||
|  |  | ||||||
|         const searchContext = new SearchContext(); |         const searchContext = new SearchContext(); | ||||||
|  |  | ||||||
|         let searchResults = searchService.findResultsWithQuery("# note.children.title =* Aust", searchContext); |         let searchResults = searchService.findResultsWithQuery("# note.children.title =* Aust", searchContext); | ||||||
|         expect(searchResults.length).toEqual(2); |         expect(searchResults.length).toEqual(2); | ||||||
|         expect(becca_mocking.findNoteByTitle(searchResults, "Europe")).toBeTruthy(); |         expect(findNoteByTitle(searchResults, "Europe")).toBeTruthy(); | ||||||
|         expect(becca_mocking.findNoteByTitle(searchResults, "Oceania")).toBeTruthy(); |         expect(findNoteByTitle(searchResults, "Oceania")).toBeTruthy(); | ||||||
|  |  | ||||||
|         searchResults = searchService.findResultsWithQuery("# note.children.title =* Aust AND note.children.title *= republic", searchContext); |         searchResults = searchService.findResultsWithQuery("# note.children.title =* Aust AND note.children.title *= republic", searchContext); | ||||||
|         expect(searchResults.length).toEqual(1); |         expect(searchResults.length).toEqual(1); | ||||||
|         expect(becca_mocking.findNoteByTitle(searchResults, "Europe")).toBeTruthy(); |         expect(findNoteByTitle(searchResults, "Europe")).toBeTruthy(); | ||||||
|  |  | ||||||
|         searchResults = searchService.findResultsWithQuery("# note.children.children.title = Prague", searchContext); |         searchResults = searchService.findResultsWithQuery("# note.children.children.title = Prague", searchContext); | ||||||
|         expect(searchResults.length).toEqual(1); |         expect(searchResults.length).toEqual(1); | ||||||
|         expect(becca_mocking.findNoteByTitle(searchResults, "Europe")).toBeTruthy(); |         expect(findNoteByTitle(searchResults, "Europe")).toBeTruthy(); | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     it("filter by relation's note properties using short syntax", () => { |     it("filter by relation's note properties using short syntax", () => { | ||||||
|         const austria = becca_mocking.note("Austria"); |         const austria = note("Austria"); | ||||||
|         const portugal = becca_mocking.note("Portugal"); |         const portugal = note("Portugal"); | ||||||
|  |  | ||||||
|         rootNote.child( |         rootNote.child(note("Europe") | ||||||
|             becca_mocking |  | ||||||
|                 .note("Europe") |  | ||||||
|                 .child(austria) |                 .child(austria) | ||||||
|                 .child(becca_mocking.note("Czech Republic").relation("neighbor", austria.note)) |                 .child(note("Czech Republic").relation("neighbor", austria.note)) | ||||||
|                 .child(portugal) |                 .child(portugal) | ||||||
|                 .child(becca_mocking.note("Spain").relation("neighbor", portugal.note)) |                 .child(note("Spain").relation("neighbor", portugal.note)) | ||||||
|         ); |         ); | ||||||
|  |  | ||||||
|         const searchContext = new SearchContext(); |         const searchContext = new SearchContext(); | ||||||
|  |  | ||||||
|         let searchResults = searchService.findResultsWithQuery("# ~neighbor.title = Austria", searchContext); |         let searchResults = searchService.findResultsWithQuery("# ~neighbor.title = Austria", searchContext); | ||||||
|         expect(searchResults.length).toEqual(1); |         expect(searchResults.length).toEqual(1); | ||||||
|         expect(becca_mocking.findNoteByTitle(searchResults, "Czech Republic")).toBeTruthy(); |         expect(findNoteByTitle(searchResults, "Czech Republic")).toBeTruthy(); | ||||||
|  |  | ||||||
|         searchResults = searchService.findResultsWithQuery("# ~neighbor.title = Portugal", searchContext); |         searchResults = searchService.findResultsWithQuery("# ~neighbor.title = Portugal", searchContext); | ||||||
|         expect(searchResults.length).toEqual(1); |         expect(searchResults.length).toEqual(1); | ||||||
|         expect(becca_mocking.findNoteByTitle(searchResults, "Spain")).toBeTruthy(); |         expect(findNoteByTitle(searchResults, "Spain")).toBeTruthy(); | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     it("filter by relation's note properties using long syntax", () => { |     it("filter by relation's note properties using long syntax", () => { | ||||||
|         const austria = becca_mocking.note("Austria"); |         const austria = note("Austria"); | ||||||
|         const portugal = becca_mocking.note("Portugal"); |         const portugal = note("Portugal"); | ||||||
|  |  | ||||||
|         rootNote.child( |         rootNote.child(note("Europe") | ||||||
|             becca_mocking |  | ||||||
|                 .note("Europe") |  | ||||||
|                 .child(austria) |                 .child(austria) | ||||||
|                 .child(becca_mocking.note("Czech Republic").relation("neighbor", austria.note)) |                 .child(note("Czech Republic").relation("neighbor", austria.note)) | ||||||
|                 .child(portugal) |                 .child(portugal) | ||||||
|                 .child(becca_mocking.note("Spain").relation("neighbor", portugal.note)) |                 .child(note("Spain").relation("neighbor", portugal.note)) | ||||||
|         ); |         ); | ||||||
|  |  | ||||||
|         const searchContext = new SearchContext(); |         const searchContext = new SearchContext(); | ||||||
|  |  | ||||||
|         const searchResults = searchService.findResultsWithQuery("# note.relations.neighbor.title = Austria", searchContext); |         const searchResults = searchService.findResultsWithQuery("# note.relations.neighbor.title = Austria", searchContext); | ||||||
|         expect(searchResults.length).toEqual(1); |         expect(searchResults.length).toEqual(1); | ||||||
|         expect(becca_mocking.findNoteByTitle(searchResults, "Czech Republic")).toBeTruthy(); |         expect(findNoteByTitle(searchResults, "Czech Republic")).toBeTruthy(); | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     it("filter by multiple level relation", () => { |     it("filter by multiple level relation", () => { | ||||||
|         const austria = becca_mocking.note("Austria"); |         const austria = note("Austria"); | ||||||
|         const slovakia = becca_mocking.note("Slovakia"); |         const slovakia = note("Slovakia"); | ||||||
|         const italy = becca_mocking.note("Italy"); |         const italy = note("Italy"); | ||||||
|         const ukraine = becca_mocking.note("Ukraine"); |         const ukraine = note("Ukraine"); | ||||||
|  |  | ||||||
|         rootNote.child( |         rootNote.child(note("Europe") | ||||||
|             becca_mocking |  | ||||||
|                 .note("Europe") |  | ||||||
|                 .child(austria.relation("neighbor", italy.note).relation("neighbor", slovakia.note)) |                 .child(austria.relation("neighbor", italy.note).relation("neighbor", slovakia.note)) | ||||||
|                 .child(becca_mocking.note("Czech Republic").relation("neighbor", austria.note).relation("neighbor", slovakia.note)) |                 .child(note("Czech Republic").relation("neighbor", austria.note).relation("neighbor", slovakia.note)) | ||||||
|                 .child(slovakia.relation("neighbor", ukraine.note)) |                 .child(slovakia.relation("neighbor", ukraine.note)) | ||||||
|                 .child(ukraine) |                 .child(ukraine) | ||||||
|         ); |         ); | ||||||
| @@ -415,25 +393,25 @@ describe("Search", () => { | |||||||
|  |  | ||||||
|         let searchResults = searchService.findResultsWithQuery("# note.relations.neighbor.relations.neighbor.title = Italy", searchContext); |         let searchResults = searchService.findResultsWithQuery("# note.relations.neighbor.relations.neighbor.title = Italy", searchContext); | ||||||
|         expect(searchResults.length).toEqual(1); |         expect(searchResults.length).toEqual(1); | ||||||
|         expect(becca_mocking.findNoteByTitle(searchResults, "Czech Republic")).toBeTruthy(); |         expect(findNoteByTitle(searchResults, "Czech Republic")).toBeTruthy(); | ||||||
|  |  | ||||||
|         searchResults = searchService.findResultsWithQuery("# note.relations.neighbor.relations.neighbor.title = Ukraine", searchContext); |         searchResults = searchService.findResultsWithQuery("# note.relations.neighbor.relations.neighbor.title = Ukraine", searchContext); | ||||||
|         expect(searchResults.length).toEqual(2); |         expect(searchResults.length).toEqual(2); | ||||||
|         expect(becca_mocking.findNoteByTitle(searchResults, "Czech Republic")).toBeTruthy(); |         expect(findNoteByTitle(searchResults, "Czech Republic")).toBeTruthy(); | ||||||
|         expect(becca_mocking.findNoteByTitle(searchResults, "Austria")).toBeTruthy(); |         expect(findNoteByTitle(searchResults, "Austria")).toBeTruthy(); | ||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     it("test note properties", () => { |     it("test note properties", () => { | ||||||
|         const austria = becca_mocking.note("Austria"); |         const austria = note("Austria"); | ||||||
|  |  | ||||||
|         austria.relation("myself", austria.note); |         austria.relation("myself", austria.note); | ||||||
|         austria.label("capital", "Vienna"); |         austria.label("capital", "Vienna"); | ||||||
|         austria.label("population", "8859000"); |         austria.label("population", "8859000"); | ||||||
|  |  | ||||||
|         rootNote |         rootNote | ||||||
|             .child(becca_mocking.note("Asia")) |             .child(note("Asia")) | ||||||
|             .child(becca_mocking.note("Europe").child(austria.child(becca_mocking.note("Vienna")).child(becca_mocking.note("Sebastian Kurz")))) |             .child(note("Europe").child(austria.child(note("Vienna")).child(note("Sebastian Kurz")))) | ||||||
|             .child(becca_mocking.note("Mozart").child(austria)); |             .child(note("Mozart").child(austria)); | ||||||
|  |  | ||||||
|         austria.note.isProtected = false; |         austria.note.isProtected = false; | ||||||
|         austria.note.dateCreated = "2020-05-14 12:11:42.001+0200"; |         austria.note.dateCreated = "2020-05-14 12:11:42.001+0200"; | ||||||
| @@ -490,12 +468,12 @@ describe("Search", () => { | |||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     it("test order by", () => { |     it("test order by", () => { | ||||||
|         const italy = becca_mocking.note("Italy").label("capital", "Rome"); |         const italy = note("Italy").label("capital", "Rome"); | ||||||
|         const slovakia = becca_mocking.note("Slovakia").label("capital", "Bratislava"); |         const slovakia = note("Slovakia").label("capital", "Bratislava"); | ||||||
|         const austria = becca_mocking.note("Austria").label("capital", "Vienna"); |         const austria = note("Austria").label("capital", "Vienna"); | ||||||
|         const ukraine = becca_mocking.note("Ukraine").label("capital", "Kiev"); |         const ukraine = note("Ukraine").label("capital", "Kiev"); | ||||||
|  |  | ||||||
|         rootNote.child(becca_mocking.note("Europe").child(ukraine).child(slovakia).child(austria).child(italy)); |         rootNote.child(note("Europe").child(ukraine).child(slovakia).child(austria).child(italy)); | ||||||
|  |  | ||||||
|         const searchContext = new SearchContext(); |         const searchContext = new SearchContext(); | ||||||
|  |  | ||||||
| @@ -533,10 +511,10 @@ describe("Search", () => { | |||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     it("test not(...)", () => { |     it("test not(...)", () => { | ||||||
|         const italy = becca_mocking.note("Italy").label("capital", "Rome"); |         const italy = note("Italy").label("capital", "Rome"); | ||||||
|         const slovakia = becca_mocking.note("Slovakia").label("capital", "Bratislava"); |         const slovakia = note("Slovakia").label("capital", "Bratislava"); | ||||||
|  |  | ||||||
|         rootNote.child(becca_mocking.note("Europe").child(slovakia).child(italy)); |         rootNote.child(note("Europe").child(slovakia).child(italy)); | ||||||
|  |  | ||||||
|         const searchContext = new SearchContext(); |         const searchContext = new SearchContext(); | ||||||
|  |  | ||||||
| @@ -550,10 +528,10 @@ describe("Search", () => { | |||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     it.skip("test note.text *=* something", () => { |     it.skip("test note.text *=* something", () => { | ||||||
|         const italy = becca_mocking.note("Italy").label("capital", "Rome"); |         const italy = note("Italy").label("capital", "Rome"); | ||||||
|         const slovakia = becca_mocking.note("Slovakia").label("capital", "Bratislava"); |         const slovakia = note("Slovakia").label("capital", "Bratislava"); | ||||||
|  |  | ||||||
|         rootNote.child(becca_mocking.note("Europe").child(slovakia).child(italy)); |         rootNote.child(note("Europe").child(slovakia).child(italy)); | ||||||
|  |  | ||||||
|         const searchContext = new SearchContext(); |         const searchContext = new SearchContext(); | ||||||
|  |  | ||||||
| @@ -563,10 +541,10 @@ describe("Search", () => { | |||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     it.skip("test that fulltext does not match archived notes", () => { |     it.skip("test that fulltext does not match archived notes", () => { | ||||||
|         const italy = becca_mocking.note("Italy").label("capital", "Rome"); |         const italy = note("Italy").label("capital", "Rome"); | ||||||
|         const slovakia = becca_mocking.note("Slovakia").label("capital", "Bratislava"); |         const slovakia = note("Slovakia").label("capital", "Bratislava"); | ||||||
|  |  | ||||||
|         rootNote.child(becca_mocking.note("Reddit").label("archived", "", true).child(becca_mocking.note("Post X")).child(becca_mocking.note("Post Y"))).child(becca_mocking.note("Reddit is bad")); |         rootNote.child(note("Reddit").label("archived", "", true).child(note("Post X")).child(note("Post Y"))).child(note("Reddit is bad")); | ||||||
|  |  | ||||||
|         const searchContext = new SearchContext({ includeArchivedNotes: false }); |         const searchContext = new SearchContext({ includeArchivedNotes: false }); | ||||||
|  |  | ||||||
| @@ -579,14 +557,14 @@ describe("Search", () => { | |||||||
|  |  | ||||||
|     // it("comparison between labels", () => { |     // it("comparison between labels", () => { | ||||||
|     //     rootNote |     //     rootNote | ||||||
|     //         .child(becca_mocking.note("Europe") |     //         .child(note("Europe") | ||||||
|     //             .child(becca_mocking.note("Austria") |     //             .child(note("Austria") | ||||||
|     //                 .label('capital', 'Vienna') |     //                 .label('capital', 'Vienna') | ||||||
|     //                 .label('largestCity', 'Vienna')) |     //                 .label('largestCity', 'Vienna')) | ||||||
|     //             .child(becca_mocking.note("Canada") |     //             .child(note("Canada") | ||||||
|     //                 .label('capital', 'Ottawa') |     //                 .label('capital', 'Ottawa') | ||||||
|     //                 .label('largestCity', 'Toronto')) |     //                 .label('largestCity', 'Toronto')) | ||||||
|     //             .child(becca_mocking.note("Czech Republic") |     //             .child(note("Czech Republic") | ||||||
|     //                 .label('capital', 'Prague') |     //                 .label('capital', 'Prague') | ||||||
|     //                 .label('largestCity', 'Prague')) |     //                 .label('largestCity', 'Prague')) | ||||||
|     //         ); |     //         ); | ||||||
| @@ -595,7 +573,7 @@ describe("Search", () => { | |||||||
|     // |     // | ||||||
|     //     const searchResults = searchService.findResultsWithQuery('#capital = #largestCity', searchContext); |     //     const searchResults = searchService.findResultsWithQuery('#capital = #largestCity', searchContext); | ||||||
|     //     expect(searchResults.length).toEqual(2); |     //     expect(searchResults.length).toEqual(2); | ||||||
|     //     expect(becca_mocking.findNoteByTitle(searchResults, "Czech Republic")).toBeTruthy(); |     //     expect(findNoteByTitle(searchResults, "Czech Republic")).toBeTruthy(); | ||||||
|     //     expect(becca_mocking.findNoteByTitle(searchResults, "Austria")).toBeTruthy(); |     //     expect(findNoteByTitle(searchResults, "Austria")).toBeTruthy(); | ||||||
|     // }) |     // }) | ||||||
| }); | }); | ||||||
|   | |||||||
| @@ -1,8 +1,8 @@ | |||||||
| import { describe, it, expect, beforeEach } from "vitest"; | import { describe, it, expect, beforeEach } from "vitest"; | ||||||
| import becca_mocking from "../../../spec/support/becca_mocking.js"; |  | ||||||
| import ValueExtractor from "./value_extractor.js"; | import ValueExtractor from "./value_extractor.js"; | ||||||
| import becca from "../../becca/becca.js"; | import becca from "../../becca/becca.js"; | ||||||
| import SearchContext from "./search_context.js"; | import SearchContext from "./search_context.js"; | ||||||
|  | import { note } from "../../../spec/support/becca_mocking.js"; | ||||||
|  |  | ||||||
| const dsc = new SearchContext(); | const dsc = new SearchContext(); | ||||||
|  |  | ||||||
| @@ -12,7 +12,7 @@ describe("Value extractor", () => { | |||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     it("simple title extraction", async () => { |     it("simple title extraction", async () => { | ||||||
|         const europe = becca_mocking.note("Europe").note; |         const europe = note("Europe").note; | ||||||
|  |  | ||||||
|         const valueExtractor = new ValueExtractor(dsc, ["note", "title"]); |         const valueExtractor = new ValueExtractor(dsc, ["note", "title"]); | ||||||
|  |  | ||||||
| @@ -21,7 +21,7 @@ describe("Value extractor", () => { | |||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     it("label extraction", async () => { |     it("label extraction", async () => { | ||||||
|         const austria = becca_mocking.note("Austria").label("Capital", "Vienna").note; |         const austria = note("Austria").label("Capital", "Vienna").note; | ||||||
|  |  | ||||||
|         let valueExtractor = new ValueExtractor(dsc, ["note", "labels", "capital"]); |         let valueExtractor = new ValueExtractor(dsc, ["note", "labels", "capital"]); | ||||||
|  |  | ||||||
| @@ -35,8 +35,8 @@ describe("Value extractor", () => { | |||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     it("parent/child property extraction", async () => { |     it("parent/child property extraction", async () => { | ||||||
|         const vienna = becca_mocking.note("Vienna"); |         const vienna = note("Vienna"); | ||||||
|         const europe = becca_mocking.note("Europe").child(becca_mocking.note("Austria").child(vienna)); |         const europe = note("Europe").child(note("Austria").child(vienna)); | ||||||
|  |  | ||||||
|         let valueExtractor = new ValueExtractor(dsc, ["note", "children", "children", "title"]); |         let valueExtractor = new ValueExtractor(dsc, ["note", "children", "children", "title"]); | ||||||
|  |  | ||||||
| @@ -50,9 +50,9 @@ describe("Value extractor", () => { | |||||||
|     }); |     }); | ||||||
|  |  | ||||||
|     it("extract through relation", async () => { |     it("extract through relation", async () => { | ||||||
|         const czechRepublic = becca_mocking.note("Czech Republic").label("capital", "Prague"); |         const czechRepublic = note("Czech Republic").label("capital", "Prague"); | ||||||
|         const slovakia = becca_mocking.note("Slovakia").label("capital", "Bratislava"); |         const slovakia = note("Slovakia").label("capital", "Bratislava"); | ||||||
|         const austria = becca_mocking.note("Austria").relation("neighbor", czechRepublic.note).relation("neighbor", slovakia.note); |         const austria = note("Austria").relation("neighbor", czechRepublic.note).relation("neighbor", slovakia.note); | ||||||
|  |  | ||||||
|         let valueExtractor = new ValueExtractor(dsc, ["note", "relations", "neighbor", "labels", "capital"]); |         let valueExtractor = new ValueExtractor(dsc, ["note", "relations", "neighbor", "labels", "capital"]); | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										72
									
								
								src/services/tree.spec.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								src/services/tree.spec.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,72 @@ | |||||||
|  | import { beforeEach, describe, expect, it, vi } from "vitest"; | ||||||
|  | import { note, NoteBuilder } from "../../spec/support/becca_mocking.js"; | ||||||
|  | import becca from "../becca/becca.js"; | ||||||
|  | import BBranch from "../becca/entities/bbranch.js"; | ||||||
|  | import BNote from "../becca/entities/bnote.js"; | ||||||
|  | import tree from "./tree.js"; | ||||||
|  | import cls from "./cls.js"; | ||||||
|  |  | ||||||
|  | describe("Tree", () => { | ||||||
|  |     let rootNote!: NoteBuilder; | ||||||
|  |  | ||||||
|  |     beforeEach(() => { | ||||||
|  |         becca.reset(); | ||||||
|  |  | ||||||
|  |         rootNote = new NoteBuilder(new BNote({ | ||||||
|  |             noteId: "root", | ||||||
|  |             title: "root", | ||||||
|  |             type: "text" | ||||||
|  |         })) | ||||||
|  |         new BBranch({ | ||||||
|  |             branchId: "none_root", | ||||||
|  |             noteId: "root", | ||||||
|  |             parentNoteId: "none", | ||||||
|  |             notePosition: 10 | ||||||
|  |         }); | ||||||
|  |  | ||||||
|  |         vi.mock("./sql.js", () => { | ||||||
|  |             return { | ||||||
|  |                 default: { | ||||||
|  |                     transactional: (cb: Function) => { | ||||||
|  |                         cb(); | ||||||
|  |                     }, | ||||||
|  |                     execute: () => { }, | ||||||
|  |                     replace: () => { }, | ||||||
|  |                     getMap: () => { } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }); | ||||||
|  |  | ||||||
|  |         vi.mock("./sql_init.js", () => { | ||||||
|  |             return { | ||||||
|  |                 dbReady: () => { console.log("Hello world") } | ||||||
|  |             } | ||||||
|  |         }); | ||||||
|  |     }); | ||||||
|  |  | ||||||
|  |     it("custom sort order is idempotent", () => { | ||||||
|  |         rootNote.label("sorted", "order"); | ||||||
|  |  | ||||||
|  |         // Add values which have a defined order. | ||||||
|  |         for (let i=0; i<=5; i++) { | ||||||
|  |             rootNote.child(note(String(i)).label("order", String(i))); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         // Add a few values which have no defined order. | ||||||
|  |         for (let i=6; i<10; i++) { | ||||||
|  |             rootNote.child(note(String(i))); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         const expectedOrder = [ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' ]; | ||||||
|  |  | ||||||
|  |         // Sort a few times to ensure that the resulting order is the same. | ||||||
|  |         for (let i=0; i<5; i++) { | ||||||
|  |             cls.init(() => { | ||||||
|  |                 tree.sortNotesIfNeeded(rootNote.note.noteId); | ||||||
|  |             }); | ||||||
|  |  | ||||||
|  |             const order = rootNote.note.children.map((child) => child.title); | ||||||
|  |             expect(order).toStrictEqual(expectedOrder); | ||||||
|  |         } | ||||||
|  |     }); | ||||||
|  | }); | ||||||
| @@ -145,8 +145,8 @@ function sortNotes(parentNoteId: string, customSortBy: string = "title", reverse | |||||||
|                 return compare(bottomBEl, bottomAEl) * (reverse ? -1 : 1); |                 return compare(bottomBEl, bottomAEl) * (reverse ? -1 : 1); | ||||||
|             } |             } | ||||||
|  |  | ||||||
|             const customAEl = fetchValue(a, customSortBy); |             const customAEl = fetchValue(a, customSortBy) ?? fetchValue(a, "title"); | ||||||
|             const customBEl = fetchValue(b, customSortBy); |             const customBEl = fetchValue(b, customSortBy) ?? fetchValue(b, "title"); | ||||||
|  |  | ||||||
|             if (customAEl !== customBEl) { |             if (customAEl !== customBEl) { | ||||||
|                 return compare(customAEl, customBEl); |                 return compare(customAEl, customBEl); | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user