flexmonster-mongo-connector
Version:
Custom data source API implementation for MongoDB
119 lines • 6.74 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.DataManager = void 0;
const LocalDataCache_1 = require("./impl/LocalDataCache");
const Register_1 = require("../requests/register/Register");
const ProbibalisticCacheStrategie_1 = require("./cacheStrategies/impl/ProbibalisticCacheStrategie");
const SimpleCacheStrategie_1 = require("./cacheStrategies/impl/SimpleCacheStrategie");
const RequestKey_1 = require("../requests/register/RequestKey");
const ConfigManager_1 = require("../config/ConfigManager");
const LoggingMessages_1 = require("../utils/consts/LoggingMessages");
const LoggingManager_1 = require("../logging/LoggingManager");
const RequestsFactory_1 = require("../requests/requestsFactory.ts/RequestsFactory");
const ArrayDataObject_1 = require("./dataObject/impl/ArrayDataObject");
const SimpleNumericIterator_1 = require("./customIterators/SimpleNumericIterator");
class DataManager {
constructor(queryBuilder, queryExecutor) {
this.isProbabilisticCacheFlushEnabled = true;
this._queryBuilder = queryBuilder;
this._queryExecutor = queryExecutor;
const cacheStategie = this.isProbabilisticCacheFlushEnabled
? new ProbibalisticCacheStrategie_1.ProbibalisticCacheStrategie() : new SimpleCacheStrategie_1.SimpleCacheStrategie();
const currentConfig = ConfigManager_1.ConfigManager.getInstance().currentConfig;
this._cacheManager = currentConfig.cacheEnabled ? new LocalDataCache_1.LocalDataCache(cacheStategie, ConfigManager_1.ConfigManager.getInstance().currentConfig) : null;
this._requestsRegister = new Register_1.Register();
}
getData(requestArgument, requestType, currentPage) {
return __awaiter(this, void 0, void 0, function* () {
if (currentPage.pageToken != null) {
const registerItem = this._requestsRegister.deleteItem(currentPage.pageToken);
if (registerItem == undefined)
throw new Error("The data has been updated. Please refresh the page.");
const retrievalResult = yield this.getDataChunk(registerItem.data, registerItem.iterator);
let nextPageToken = null;
if (!retrievalResult.isFinished) {
nextPageToken = new RequestKey_1.RequestKey(registerItem.apiRequest.requestArgument.clientQuery).hash();
this._requestsRegister.addItem(nextPageToken, registerItem);
}
return registerItem.apiRequest.toJSON(retrievalResult.data, nextPageToken);
}
const apiRequest = RequestsFactory_1.RequestFactory.createRequestInstance(requestArgument, requestType);
const dataInstance = yield this._getData(apiRequest);
const iterator = this.getIterator(dataInstance);
const retrievalResult = yield this.getDataChunk(dataInstance, iterator);
let nextPageToken = null;
if (!retrievalResult.isFinished) {
nextPageToken = new RequestKey_1.RequestKey(apiRequest.requestArgument.clientQuery).hash();
this._requestsRegister.addItem(nextPageToken, {
data: dataInstance,
iterator: iterator,
apiRequest: apiRequest
});
}
return apiRequest.toJSON(retrievalResult.data, nextPageToken);
});
}
_getData(apiRequest) {
return __awaiter(this, void 0, void 0, function* () {
const cacheKey = {
databaseName: apiRequest.requestArgument.db.databaseName,
index: apiRequest.requestArgument.index,
clientQuery: apiRequest.requestArgument.clientQuery
};
let data = this.getDataFromCache(cacheKey);
LoggingManager_1.LoggingManager.log(`Client query: ${JSON.stringify(apiRequest.requestArgument.clientQuery)}`);
if (data === undefined) {
data = yield apiRequest.getData(this._queryBuilder, this._queryExecutor);
this.setDataToCache(cacheKey, data);
if (ConfigManager_1.ConfigManager.getInstance().currentConfig.cacheEnabled) {
LoggingManager_1.LoggingManager.log(`Putting ${apiRequest.loggingTemplate} data to cache`);
LoggingManager_1.LoggingManager.log(this.getCacheMemoryStatus());
}
}
else {
LoggingManager_1.LoggingManager.log(`Getting ${apiRequest.loggingTemplate} data from cache`);
}
return data;
});
}
getDataFromCache(keyObject) {
if (this._cacheManager === null)
return undefined;
return this._cacheManager.getCache(keyObject);
}
setDataToCache(keyObject, data) {
if (this._cacheManager === null)
return undefined;
this._cacheManager.setCache(keyObject, data);
}
getCacheMemoryStatus() {
if (this._cacheManager === null)
return LoggingMessages_1.LoggingMessages.DISABLED_CACHE_MESSAGE;
return this._cacheManager.getCacheMemoryStatus();
}
getIterator(dataInstance) {
if (dataInstance instanceof ArrayDataObject_1.ArrayDataObject) {
return dataInstance.isCompleted ? dataInstance.getIterationKeys() : new SimpleNumericIterator_1.SimpleNumericIterator();
}
return dataInstance.getIterationKeys();
}
getDataChunk(dataInstance, iterator) {
return __awaiter(this, void 0, void 0, function* () {
if (dataInstance instanceof ArrayDataObject_1.ArrayDataObject) {
return dataInstance.isCompleted ? dataInstance.getChunk(iterator) : dataInstance.getChunkAsync(iterator);
}
return dataInstance.getChunk(iterator);
});
}
}
exports.DataManager = DataManager;
//# sourceMappingURL=DataManager.js.map