Skip to content

Instantly share code, notes, and snippets.

@encap
Created February 2, 2021 15:06
Show Gist options
  • Save encap/685f86fa5f902b96c4e06e0b2dc920b7 to your computer and use it in GitHub Desktop.
Save encap/685f86fa5f902b96c4e06e0b2dc920b7 to your computer and use it in GitHub Desktop.
FaunaDB query to handle run stats (from server.js in CodeRush repo)
try {
const qResponse = await client.query(
[
q.Select(['data', 'total'],
q.Let(
{
lang: q.Get(q.Match(q.Index('languageByIndex'), main.languageIndex)),
ref: q.Select(['ref'], q.Var('lang')),
},
q.Update(q.Var('ref'),
{
data: {
total: q.Add(q.Select(['data', 'total'], q.Var('lang')), 1),
},
},
),
),
),
// recalculate max
q.Select(['data', 'value'],
q.Let(
{
doc: q.Get(q.Match(q.Index('statByName'), 'best')),
ref: q.Select(['ref'], q.Var('doc')),
},
q.Update(q.Var('ref'),
{
data: {
value: q.Max([q.Select(['data', 'value'], q.Var('doc')), main.wpm]),
},
},
),
),
),
// save run
q.Create(
q.Collection('runs'),
{
data: main,
},
),
// calculate avg
q.Select(['data', 'value'],
q.Let(
{
doc: q.Get(q.Match(q.Index('statByName'), 'avg')),
ref: q.Select(['ref'], q.Var('doc')),
},
q.Update(q.Var('ref'),
{
data: {
value: q.Round(
q.Select(
['data', 0],
q.Mean(
q.Map(
q.Paginate(q.Match(q.Index('runsWpmByDate')), { size: 100 }),
q.Lambda(['ts', 'wpm'], q.Var('wpm')),
),
),
),
1, // precision
),
},
},
),
),
),
// totalStats
q.Map(
Object.entries(misc),
q.Lambda(
['name', 'value'],
q.Let(
{
ret: q.Let(
{
doc: q.Get(q.Match(q.Index('statByName'), q.Var('name'))),
ref: q.Select(['ref'], q.Var('doc')),
},
q.Update(q.Var('ref'),
{
data: {
value: q.Add(q.Select(['data', 'value'], q.Var('doc')), q.Var('value')),
},
},
),
),
},
[
q.Select(['data', 'name'], q.Var('ret')),
q.Select(['data', 'value'], q.Var('ret')),
],
),
),
),
],
);
let statsResponse;
[database.languages[main.languageIndex].total, database.stats.best, , database.stats.avg, statsResponse] = qResponse;
database.stats = {
...database.stats,
...Object.fromEntries(statsResponse),
};
updateDatabaseCache();
res.sendStatus(200);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment