src/data-handler/data-fetcher.js
import KEYS from '../constants/keys';
export default function createDataFetcher({ layoutService, model }) {
let lastDataWindow;
const dataFetcher = {
fetch() {
if (layoutService.meta.isSnapshot) {
return Promise.resolve(layoutService.getDataPages());
}
const NUM_BUBBLES_PER_FETCH = 2500;
const NUM_BUBBLES = Math.min(layoutService.meta.maxVisibleBubbles, layoutService.meta.size.y || 0);
const numFetches = Math.ceil(NUM_BUBBLES / NUM_BUBBLES_PER_FETCH);
const dataRects = [];
for (let i = 0; i < numFetches; i++) {
dataRects[i] = {
qTop: i * NUM_BUBBLES_PER_FETCH,
qLeft: 0,
qWidth: 4,
qHeight: NUM_BUBBLES_PER_FETCH,
};
}
// Do not fetch same data window twice in a row (important for performance)
const dataWindow = JSON.stringify(dataRects[0]);
if (lastDataWindow === dataWindow) {
return Promise.reject(KEYS.REJECTION_TOKEN);
}
lastDataWindow = dataWindow;
const queriesPromises = dataRects.map((dataRect) => model.getHyperCubeData('/qHyperCubeDef', [dataRect]));
return Promise.all(queriesPromises).then((pagesArray) => {
const pages = [
{
qArea: {
qLeft: 0,
qTop: 0,
qWidth: pagesArray[pagesArray.length - 1][0].qArea.qWidth,
qHeight: NUM_BUBBLES,
},
qMatrix: [],
qTails: pagesArray[0][0].qTails,
},
];
pagesArray.forEach((p) => pages[0].qMatrix.push(...p[0].qMatrix));
layoutService.setLayoutValue('dataPages', undefined);
layoutService.setDataPages(pages);
return pages;
});
},
};
return dataFetcher;
}