Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • graphpolaris/microservices/query-service
1 result
Show changes
Commits on Source (1)
...@@ -13,31 +13,33 @@ import { Neo4jConnection } from 'ts-common/neo4j'; ...@@ -13,31 +13,33 @@ import { Neo4jConnection } from 'ts-common/neo4j';
import type { QueryCypher } from '../utils/cypher/converter/queryConverter'; import type { QueryCypher } from '../utils/cypher/converter/queryConverter';
async function cacheCheck(cacheKey: string): Promise<GraphQueryResultMetaFromBackend | undefined> { async function cacheCheck(cacheKey: string): Promise<GraphQueryResultMetaFromBackend | undefined> {
if (QUERY_CACHE_DURATION === '') { log.debug('Checking cache for query, with cache ttl', QUERY_CACHE_DURATION, 'seconds');
log.info('Query cache disabled, skipping cache check'); const cached = await redis.client.get(cacheKey);
} else { if (cached) {
log.debug('Checking cache for query, with cache ttl', QUERY_CACHE_DURATION, 'seconds'); log.info('Cache hit for query');
const cached = await redis.client.get(cacheKey); const buf = Buffer.from(cached, 'base64');
if (cached) { const inflated = Bun.gunzipSync(new Uint8Array(buf));
log.info('Cache hit for query'); const dec = new TextDecoder();
const buf = Buffer.from(cached, 'base64'); const cachedMessage = JSON.parse(dec.decode(inflated)) as GraphQueryResultMetaFromBackend;
const inflated = Bun.gunzipSync(new Uint8Array(buf)); return cachedMessage;
const dec = new TextDecoder();
const cachedMessage = JSON.parse(dec.decode(inflated)) as GraphQueryResultMetaFromBackend;
return cachedMessage;
}
} }
} }
export const queryService = async (db: DbConnection, cypher: QueryCypher): Promise<GraphQueryResultMetaFromBackend> => { export const queryService = async (db: DbConnection, cypher: QueryCypher, useCached: boolean): Promise<GraphQueryResultMetaFromBackend> => {
let index = 0; let index = 0;
const disambiguatedQuery = cypher.query.replace(/\d{13}/g, () => (index++).toString()); const disambiguatedQuery = cypher.query.replace(/\d{13}/g, () => (index++).toString());
const cacheKey = Bun.hash(JSON.stringify({ db: db, query: disambiguatedQuery })).toString(); const cacheKey = Bun.hash(JSON.stringify({ db: db, query: disambiguatedQuery })).toString();
const cachedMessage = await cacheCheck(cacheKey); if (QUERY_CACHE_DURATION === '') {
if (cachedMessage) { log.info('Query cache disabled, skipping cache check');
log.debug('Cache hit for query', disambiguatedQuery); } else if (!useCached) {
return cachedMessage; log.info('Skipping cache check for query due to parameter', useCached);
} else {
const cachedMessage = await cacheCheck(cacheKey);
if (cachedMessage) {
log.debug('Cache hit for query', disambiguatedQuery);
return cachedMessage;
}
} }
// TODO: only neo4j is supported for now // TODO: only neo4j is supported for now
...@@ -176,7 +178,7 @@ export const queryServiceReader = async (frontendPublisher: RabbitMqBroker, mlPu ...@@ -176,7 +178,7 @@ export const queryServiceReader = async (frontendPublisher: RabbitMqBroker, mlPu
for (let i = 0; i < ss.dbConnections.length; i++) { for (let i = 0; i < ss.dbConnections.length; i++) {
try { try {
const result = await queryService(ss.dbConnections[i], cypher); const result = await queryService(ss.dbConnections[i], cypher, message.useCached);
// Cache nodeCounts such that we can display differentiation for each query // Cache nodeCounts such that we can display differentiation for each query
await ums.updateQuery(headers.message.sessionData.userID, message.saveStateID, { await ums.updateQuery(headers.message.sessionData.userID, message.saveStateID, {
......