Adding start to redis caching.
This commit is contained in:
parent
02855fa37b
commit
4960ad760e
|
@ -16,6 +16,7 @@ exports.Databases = {
|
||||||
USER_CACHE: "users",
|
USER_CACHE: "users",
|
||||||
FLAGS: "flags",
|
FLAGS: "flags",
|
||||||
APP_METADATA: "appMetadata",
|
APP_METADATA: "appMetadata",
|
||||||
|
QUERY_VARS: "queryVars",
|
||||||
}
|
}
|
||||||
|
|
||||||
exports.SEPARATOR = SEPARATOR
|
exports.SEPARATOR = SEPARATOR
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
const { processString } = require("@budibase/string-templates")
|
|
||||||
const CouchDB = require("../../../db")
|
const CouchDB = require("../../../db")
|
||||||
const {
|
const {
|
||||||
generateQueryID,
|
generateQueryID,
|
||||||
|
@ -90,47 +89,6 @@ exports.save = async function (ctx) {
|
||||||
ctx.message = `Query ${query.name} saved successfully.`
|
ctx.message = `Query ${query.name} saved successfully.`
|
||||||
}
|
}
|
||||||
|
|
||||||
async function enrichQueryFields(fields, parameters = {}) {
|
|
||||||
const enrichedQuery = {}
|
|
||||||
|
|
||||||
// enrich the fields with dynamic parameters
|
|
||||||
for (let key of Object.keys(fields)) {
|
|
||||||
if (fields[key] == null) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
if (typeof fields[key] === "object") {
|
|
||||||
// enrich nested fields object
|
|
||||||
enrichedQuery[key] = await enrichQueryFields(fields[key], parameters)
|
|
||||||
} else if (typeof fields[key] === "string") {
|
|
||||||
// enrich string value as normal
|
|
||||||
enrichedQuery[key] = await processString(fields[key], parameters, {
|
|
||||||
noHelpers: true,
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
enrichedQuery[key] = fields[key]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (
|
|
||||||
enrichedQuery.json ||
|
|
||||||
enrichedQuery.customData ||
|
|
||||||
enrichedQuery.requestBody
|
|
||||||
) {
|
|
||||||
try {
|
|
||||||
enrichedQuery.json = JSON.parse(
|
|
||||||
enrichedQuery.json ||
|
|
||||||
enrichedQuery.customData ||
|
|
||||||
enrichedQuery.requestBody
|
|
||||||
)
|
|
||||||
} catch (err) {
|
|
||||||
// no json found, ignore
|
|
||||||
}
|
|
||||||
delete enrichedQuery.customData
|
|
||||||
}
|
|
||||||
|
|
||||||
return enrichedQuery
|
|
||||||
}
|
|
||||||
|
|
||||||
exports.find = async function (ctx) {
|
exports.find = async function (ctx) {
|
||||||
const db = new CouchDB(ctx.appId)
|
const db = new CouchDB(ctx.appId)
|
||||||
const query = enrichQueries(await db.get(ctx.params.queryId))
|
const query = enrichQueries(await db.get(ctx.params.queryId))
|
||||||
|
@ -148,13 +106,13 @@ exports.preview = async function (ctx) {
|
||||||
const datasource = await db.get(ctx.request.body.datasourceId)
|
const datasource = await db.get(ctx.request.body.datasourceId)
|
||||||
|
|
||||||
const { fields, parameters, queryVerb, transformer } = ctx.request.body
|
const { fields, parameters, queryVerb, transformer } = ctx.request.body
|
||||||
const enrichedQuery = await enrichQueryFields(fields, parameters)
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const { rows, keys, info, extra } = await Runner.run({
|
const { rows, keys, info, extra } = await Runner.run({
|
||||||
datasource,
|
datasource,
|
||||||
queryVerb,
|
queryVerb,
|
||||||
query: enrichedQuery,
|
fields,
|
||||||
|
parameters,
|
||||||
transformer,
|
transformer,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -175,17 +133,13 @@ async function execute(ctx, opts = { rowsOnly: false }) {
|
||||||
const query = await db.get(ctx.params.queryId)
|
const query = await db.get(ctx.params.queryId)
|
||||||
const datasource = await db.get(query.datasourceId)
|
const datasource = await db.get(query.datasourceId)
|
||||||
|
|
||||||
const enrichedQuery = await enrichQueryFields(
|
|
||||||
query.fields,
|
|
||||||
ctx.request.body.parameters
|
|
||||||
)
|
|
||||||
|
|
||||||
// call the relevant CRUD method on the integration class
|
// call the relevant CRUD method on the integration class
|
||||||
try {
|
try {
|
||||||
const { rows, extra } = await Runner.run({
|
const { rows, extra } = await Runner.run({
|
||||||
datasource,
|
datasource,
|
||||||
queryVerb: query.queryVerb,
|
queryVerb: query.queryVerb,
|
||||||
query: enrichedQuery,
|
fields: query.fields,
|
||||||
|
parameters: ctx.request.body.parameter,
|
||||||
transformer: query.transformer,
|
transformer: query.transformer,
|
||||||
})
|
})
|
||||||
if (opts && opts.rowsOnly) {
|
if (opts && opts.rowsOnly) {
|
||||||
|
|
|
@ -1,6 +1,66 @@
|
||||||
require("./utils").threadSetup()
|
require("./utils").threadSetup()
|
||||||
const ScriptRunner = require("../utilities/scriptRunner")
|
const ScriptRunner = require("../utilities/scriptRunner")
|
||||||
const { integrations } = require("../integrations")
|
const { integrations } = require("../integrations")
|
||||||
|
const { processStringSync } = require("@budibase/string-templates")
|
||||||
|
|
||||||
|
async function addDatasourceVariables(datasource, parameters) {
|
||||||
|
if (!datasource || !datasource.config) {
|
||||||
|
return parameters
|
||||||
|
}
|
||||||
|
const staticVars = datasource.config.staticVariables || {}
|
||||||
|
const dynamicVars = datasource.config.dynamicVariables || []
|
||||||
|
for (let [key, value] of Object.entries(staticVars)) {
|
||||||
|
if (!parameters[key]) {
|
||||||
|
parameters[key] = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (let variable of dynamicVars) {
|
||||||
|
console.log(variable)
|
||||||
|
// TODO: get the variable from query
|
||||||
|
}
|
||||||
|
return parameters
|
||||||
|
}
|
||||||
|
|
||||||
|
function enrichQueryFields(fields, parameters = {}) {
|
||||||
|
const enrichedQuery = {}
|
||||||
|
|
||||||
|
// enrich the fields with dynamic parameters
|
||||||
|
for (let key of Object.keys(fields)) {
|
||||||
|
if (fields[key] == null) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if (typeof fields[key] === "object") {
|
||||||
|
// enrich nested fields object
|
||||||
|
enrichedQuery[key] = enrichQueryFields(fields[key], parameters)
|
||||||
|
} else if (typeof fields[key] === "string") {
|
||||||
|
// enrich string value as normal
|
||||||
|
enrichedQuery[key] = processStringSync(fields[key], parameters, {
|
||||||
|
noHelpers: true,
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
enrichedQuery[key] = fields[key]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
enrichedQuery.json ||
|
||||||
|
enrichedQuery.customData ||
|
||||||
|
enrichedQuery.requestBody
|
||||||
|
) {
|
||||||
|
try {
|
||||||
|
enrichedQuery.json = JSON.parse(
|
||||||
|
enrichedQuery.json ||
|
||||||
|
enrichedQuery.customData ||
|
||||||
|
enrichedQuery.requestBody
|
||||||
|
)
|
||||||
|
} catch (err) {
|
||||||
|
// no json found, ignore
|
||||||
|
}
|
||||||
|
delete enrichedQuery.customData
|
||||||
|
}
|
||||||
|
|
||||||
|
return enrichedQuery
|
||||||
|
}
|
||||||
|
|
||||||
function formatResponse(resp) {
|
function formatResponse(resp) {
|
||||||
if (typeof resp === "string") {
|
if (typeof resp === "string") {
|
||||||
|
@ -22,7 +82,16 @@ function hasExtraData(response) {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
async function runAndTransform(datasource, queryVerb, query, transformer) {
|
async function runAndTransform(
|
||||||
|
datasource,
|
||||||
|
queryVerb,
|
||||||
|
fields,
|
||||||
|
parameters,
|
||||||
|
transformer
|
||||||
|
) {
|
||||||
|
// pre-query, make sure datasource variables are added to parameters
|
||||||
|
parameters = await addDatasourceVariables(datasource, parameters)
|
||||||
|
const query = enrichQueryFields(fields, parameters)
|
||||||
const Integration = integrations[datasource.source]
|
const Integration = integrations[datasource.source]
|
||||||
if (!Integration) {
|
if (!Integration) {
|
||||||
throw "Integration type does not exist."
|
throw "Integration type does not exist."
|
||||||
|
@ -69,7 +138,8 @@ module.exports = (input, callback) => {
|
||||||
runAndTransform(
|
runAndTransform(
|
||||||
input.datasource,
|
input.datasource,
|
||||||
input.queryVerb,
|
input.queryVerb,
|
||||||
input.query,
|
input.fields,
|
||||||
|
input.parameters,
|
||||||
input.transformer
|
input.transformer
|
||||||
)
|
)
|
||||||
.then(response => {
|
.then(response => {
|
||||||
|
|
|
@ -1,6 +1,18 @@
|
||||||
const env = require("../environment")
|
const env = require("../environment")
|
||||||
const CouchDB = require("../db")
|
const CouchDB = require("../db")
|
||||||
const { init } = require("@budibase/auth")
|
const { init } = require("@budibase/auth")
|
||||||
|
const redis = require("@budibase/auth/redis")
|
||||||
|
const { SEPARATOR } = require("@budibase/auth/db")
|
||||||
|
|
||||||
|
let client
|
||||||
|
|
||||||
|
if (!client) {
|
||||||
|
client = await new redis.Client(redis.utils.Databases.QUERY_VARS).init()
|
||||||
|
}
|
||||||
|
|
||||||
|
process.on("exit", async () => {
|
||||||
|
if (client) await client.finish()
|
||||||
|
})
|
||||||
|
|
||||||
exports.threadSetup = () => {
|
exports.threadSetup = () => {
|
||||||
// don't run this if not threading
|
// don't run this if not threading
|
||||||
|
@ -11,3 +23,11 @@ exports.threadSetup = () => {
|
||||||
env.setInThread()
|
env.setInThread()
|
||||||
init(CouchDB)
|
init(CouchDB)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function makeVariableKey(queryId, variable) {
|
||||||
|
return `${queryId}${SEPARATOR}${variable}`
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.checkCacheForDynamicVariable = async (queryId, variable) => {
|
||||||
|
await client.get(makeVariableKey(queryId, variable))
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue