mirror of https://github.com/Budibase/budibase.git
44 changed files with 754 additions and 441 deletions
@ -0,0 +1,20 @@ |
|||
import { getRecordInfo } from "../recordApi/recordInfo"; |
|||
import { |
|||
getParentKey, getLastPartInKey |
|||
} from "../templateApi/hierarchy"; |
|||
import { keySep } from "../common"; |
|||
|
|||
export const getIndexDir = (hierarchy, indexKey) => { |
|||
|
|||
const parentKey = getParentKey(indexKey); |
|||
|
|||
if(parentKey === "") return indexKey; |
|||
if(parentKey === keySep) return indexKey; |
|||
|
|||
const recordInfo = getRecordInfo( |
|||
hierarchy, |
|||
parentKey); |
|||
|
|||
return recordInfo.child( |
|||
getLastPartInKey(indexKey)); |
|||
} |
|||
@ -0,0 +1,124 @@ |
|||
import { folderStructureArray } from "../src/indexing/allIds"; |
|||
import { getRecordInfo } from "../src/recordApi/recordInfo"; |
|||
import {setupApphierarchy} from "./specHelpers"; |
|||
|
|||
describe("getRecordInfo", () => { |
|||
|
|||
it("dir should not be sharded when record count = 1000", async () => { |
|||
const {root} = (await setup({parentCount: 1000})).appHierarchy; |
|||
const {dir} = getRecordInfo(root, "/parents/1-abcd"); |
|||
expect(dir).toBe("/parents/1/1-abcd"); |
|||
}); |
|||
|
|||
it("dir should be sharded when record count = 1001", async () => { |
|||
const {root} = (await setup({parentCount: 1001})).appHierarchy; |
|||
const {dir} = getRecordInfo(root, "/parents/1-abcd"); |
|||
expect(dir).toBe("/parents/1/0123456789abcdefghijklmnopqrstuv/1-abcd"); |
|||
}); |
|||
|
|||
it("dir should be sharded to one char per folder when record count = 63,000 (64*1000)", async () => { |
|||
const {root} = (await setup({parentCount: 64000})).appHierarchy; |
|||
const {dir} = getRecordInfo(root, "/parents/1-abcd"); |
|||
expect(dir).toBe("/parents/1/a/1-abcd"); |
|||
}); |
|||
|
|||
it("dir should be sharded to one char per folder, on 2 levels when record count = 4096000 (64*64*1000)", async () => { |
|||
const {root} = (await setup({parentCount: 4096000})).appHierarchy; |
|||
const {dir} = getRecordInfo(root, "/parents/1-abcd"); |
|||
expect(dir).toBe("/parents/1/a/b/1-abcd"); |
|||
}); |
|||
|
|||
it("child dir should not be sharded when record count = 1000", async () => { |
|||
const {root, child} = (await setup({parentCount: 4096000, childCount: 1000})).appHierarchy; |
|||
const {dir} = getRecordInfo(root, `/parents/1-abcd/children/${child.nodeId}-defg`); |
|||
expect(dir).toBe(`/parents/1/a/b/1-abcd/children/${child.nodeId}/${child.nodeId}-defg`); |
|||
}); |
|||
|
|||
it("grandchild dir should not be sharded when record count = 1000", async () => { |
|||
const {root, child, grandchild} = (await setup({parentCount: 4096000, childCount: 4096000})).appHierarchy; |
|||
const {dir} = getRecordInfo(root, `/parents/1-abcd/children/${child.nodeId}-defg/grandchildren/${grandchild.nodeId}-hijk`); |
|||
expect(dir).toBe(`/parents/1/a/b/1-abcd/children/${child.nodeId}/d/e/${child.nodeId}-defg/grandchildren/${grandchild.nodeId}/${grandchild.nodeId}-hijk`); |
|||
}); |
|||
|
|||
it("grandchild dir should be sharded when record count = 4096000", async () => { |
|||
const {root, child, grandchild} = (await setup({parentCount: 4096000, childCount: 4096000, grandChildCount: 4096000})).appHierarchy; |
|||
const {dir} = getRecordInfo(root, `/parents/1-abcd/children/${child.nodeId}-defg/grandchildren/${grandchild.nodeId}-hijk`); |
|||
expect(dir).toBe(`/parents/1/a/b/1-abcd/children/${child.nodeId}/d/e/${child.nodeId}-defg/grandchildren/${grandchild.nodeId}/h/i/${grandchild.nodeId}-hijk`); |
|||
}); |
|||
|
|||
it("child levels can be sharded, with parent not", async () => { |
|||
const {root, child, grandchild} = (await setup({parentCount: 1000, childCount: 4096000, grandChildCount: 4096000})).appHierarchy; |
|||
const {dir} = getRecordInfo(root, `/parents/1-abcd/children/${child.nodeId}-defg/grandchildren/${grandchild.nodeId}-hijk`); |
|||
expect(dir).toBe(`/parents/1/1-abcd/children/${child.nodeId}/d/e/${child.nodeId}-defg/grandchildren/${grandchild.nodeId}/h/i/${grandchild.nodeId}-hijk`); |
|||
}); |
|||
|
|||
|
|||
}); |
|||
|
|||
|
|||
describe("folderStructureArray", () => { |
|||
|
|||
const recordNode = (count) => ({estimatedRecordCount: count}); |
|||
|
|||
it("should return [] when folder count < 1000", () => { |
|||
const result = folderStructureArray(recordNode(999)); |
|||
expect(result).toEqual([]); |
|||
}); |
|||
|
|||
it("should return [4] when folder count between 3000 - 4000", () => { |
|||
const result = folderStructureArray(recordNode(3456)); |
|||
expect(result).toEqual([4]); |
|||
}) |
|||
|
|||
it("should return [64, 2] when folder count between 64000 - 65000", () => { |
|||
const result = folderStructureArray(recordNode(64001)); |
|||
expect(result).toEqual([64, 2]); |
|||
}) |
|||
|
|||
it("should return [64, 64] when folder = 4095999", () => { |
|||
const result = folderStructureArray(recordNode(4095999)); |
|||
expect(result).toEqual([64, 64]); |
|||
}); |
|||
|
|||
it("should return [64, 64] when folder = 4096000", () => { |
|||
const result = folderStructureArray(recordNode(4096000)); |
|||
expect(result).toEqual([64, 64]); |
|||
}); |
|||
|
|||
it("should return [64, 64, 2] when folder = 4096001", () => { |
|||
const result = folderStructureArray(recordNode(4096001)); |
|||
expect(result).toEqual([64, 64, 2]); |
|||
}); |
|||
|
|||
}); |
|||
|
|||
const setup = ({parentCount, childCount, grandChildCount}) => |
|||
setupApphierarchy((templateApi) => { |
|||
|
|||
const root = templateApi.getNewRootLevel(); |
|||
|
|||
const addField = (recordNode) => { |
|||
const field = templateApi.getNewField("string"); |
|||
field.name = "test"; |
|||
templateApi.addField(recordNode, field); |
|||
return field; |
|||
}; |
|||
|
|||
const parent = templateApi.getNewRecordTemplate(root, "parent"); |
|||
parent.estimatedRecordCount = parentCount || 1000; |
|||
parent.collectionName = "parents"; |
|||
addField(parent); |
|||
const child = templateApi.getNewRecordTemplate(parent, "child"); |
|||
child.estimatedRecordCount = childCount || 1000; |
|||
child.collectionName = "children"; |
|||
addField(child); |
|||
const grandchild = templateApi.getNewRecordTemplate(child, "grandchild"); |
|||
grandchild.estimatedRecordCount = grandChildCount || 1000; |
|||
grandchild.collectionName = "grandchildren"; |
|||
addField(grandchild); |
|||
|
|||
return ({ |
|||
parent, child, grandchild, root |
|||
}); |
|||
}); |
|||
|
|||
Loading…
Reference in new issue