import { setupApphierarchy, basicAppHierarchyCreator_WithFields_AndIndexes, } from "./specHelpers" import { getRelevantReverseReferenceIndexes, getRelevantAncestorIndexes, } from "../src/indexing/relevant" import { some } from "lodash" import { joinKey } from "../src/common" import { getRecordInfo } from "../src/recordApi/recordInfo" describe("getRelevantIndexes", () => { it("should get indexes only, when key is root level record", async () => { const { appHierarchy } = await setupApphierarchy( basicAppHierarchyCreator_WithFields_AndIndexes ) const heirarchalIndexesByPath = getRelevantAncestorIndexes( appHierarchy.root, { appName: "hello", key: "/settings", } ) const reverseReferenceIndexesByPath = getRelevantReverseReferenceIndexes( appHierarchy.root, { appName: "hello", key: "/settings", } ) expect(heirarchalIndexesByPath.length).toBe(0) expect(reverseReferenceIndexesByPath.length).toBe(0) }) it("should get collection default index, when key is child of root level collection", async () => { const { recordApi, appHierarchy } = await setupApphierarchy( basicAppHierarchyCreator_WithFields_AndIndexes ) const customer = recordApi.getNew("/customers", "customer") const indexes = getRelevantAncestorIndexes(appHierarchy.root, customer) expect(indexes.length).toBe(4) const indexExists = key => some(indexes, c => c.indexDir === key) expect(indexExists("/customer_index")).toBeTruthy() expect(indexExists("/deceased")).toBeTruthy() expect(indexExists("/customersBySurname")).toBeTruthy() }) it("should ignore index when allowedRecordNodeIds does not contain record's node id", async () => { const { recordApi, appHierarchy } = await setupApphierarchy( basicAppHierarchyCreator_WithFields_AndIndexes ) const customer = recordApi.getNew("/customers", "customer") const invoice = recordApi.getNew( joinKey(customer.key, "invoices"), "invoice" ) const indexes = getRelevantAncestorIndexes(appHierarchy.root, invoice) const indexExists = key => some(indexes, c => c.indexDir === key) expect(indexExists("/customersBySurname")).toBeFalsy() }) it("should include index when allowedRecordNodeIds contains record's node id", async () => { const { recordApi, appHierarchy } = await setupApphierarchy( basicAppHierarchyCreator_WithFields_AndIndexes ) const customer = recordApi.getNew("/customers", "customer") const indexes = getRelevantAncestorIndexes(appHierarchy.root, customer) expect(indexes.length).toBe(4) const indexExists = key => some(indexes, c => c.indexDir === key) expect(indexExists("/customersBySurname")).toBeTruthy() }) it("should get default index and relevant parent index when record is 2 nested collections deep", async () => { const { recordApi, appHierarchy } = await setupApphierarchy( basicAppHierarchyCreator_WithFields_AndIndexes ) const nodeid = appHierarchy.customerRecord.nodeId const invoice = recordApi.getNew( `/customers/${nodeid}-1234/invoices`, "invoice" ) const indexes = getRelevantAncestorIndexes(appHierarchy.root, invoice) const { dir } = getRecordInfo( appHierarchy.root, `/customers/${nodeid}-1234` ) expect(indexes.length).toBe(4) expect(some(indexes, i => i.indexDir === `/customer_invoices`)).toBeTruthy() expect( some(indexes, i => i.indexDir === `${dir}/invoice_index`) ).toBeTruthy() }) it("should get reverseReferenceIndex accross hierarchy branches", async () => { const { appHierarchy, recordApi } = await setupApphierarchy( basicAppHierarchyCreator_WithFields_AndIndexes ) const partner = recordApi.getNew("/partners", "partner") partner.businessName = "acme inc" //await recordApi.save(partner); const customer = recordApi.getNew("/customers", "customer") customer.partner = { key: partner.key, value: partner.businessName } //await recordApi.save(customer); const indexes = getRelevantReverseReferenceIndexes( appHierarchy.root, customer ) expect(indexes.length).toBe(1) const partnerdir = getRecordInfo(appHierarchy.root, partner.key).dir expect(indexes[0].indexDir).toBe( joinKey(partnerdir, appHierarchy.partnerCustomersReverseIndex.name) ) }) it("should get reverseReferenceIndex when referencing record in same collection", async () => { const { appHierarchy, recordApi } = await setupApphierarchy( basicAppHierarchyCreator_WithFields_AndIndexes ) const referredByCustomer = recordApi.getNew("/customers", "customer") referredByCustomer.surname = "ledog" const referredToCustomer = recordApi.getNew("/customers", "customer") referredToCustomer.referredBy = { key: referredByCustomer.key, value: "ledog", } const indexes = getRelevantReverseReferenceIndexes( appHierarchy.root, referredToCustomer ) const referredByCustomerDir = getRecordInfo( appHierarchy.root, referredByCustomer.key ).dir expect(indexes.length).toBe(1) expect(indexes[0].indexDir).toBe( joinKey( referredByCustomerDir, appHierarchy.referredToCustomersReverseIndex.name ) ) }) })