Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 20 additions & 0 deletions observable/src/data/vigilo-stats-by-category.json.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { runDuckDBLoader, parquetPath } from "./db.js";

const scopes = parquetPath("vigilo", "scopes.parquet");
const obs = parquetPath("vigilo", "observations.parquet");
const cats = parquetPath("vigilo", "categories.parquet");

await runDuckDBLoader(
"vigilo-stats-by-category",
`SELECT s.id AS scope_id, s.display_name AS scope_name,
c.name AS category, c.color, COUNT(*)::INTEGER AS count
FROM read_parquet(${JSON.stringify(obs)}) o
JOIN read_parquet(${JSON.stringify(scopes)}) s ON s.id = o.scopeid
JOIN read_parquet(${JSON.stringify(cats)}) c ON c.id = o.catid
WHERE s.id IN (
SELECT scopeid FROM read_parquet(${JSON.stringify(obs)})
GROUP BY scopeid HAVING COUNT(*) > 200
)
GROUP BY s.id, s.display_name, c.name, c.color
ORDER BY s.display_name, c.name`,
);
25 changes: 25 additions & 0 deletions observable/src/data/vigilo-stats.json.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
import { runDuckDBLoader, parquetPath } from "./db.js";

const scopes = parquetPath("vigilo", "scopes.parquet");
const obs = parquetPath("vigilo", "observations.parquet");

await runDuckDBLoader(
"vigilo-stats",
`SELECT s.id, s.display_name, s.is_active,
COUNT(o.token)::INTEGER AS count,
MIN(o.ts) AS first_ts, MAX(o.ts) AS last_ts,
(SELECT COUNT(*)::INTEGER FROM read_parquet(${JSON.stringify(
scopes,
)})) AS total_scopes,
(SELECT COUNT(*)::INTEGER FROM read_parquet(${JSON.stringify(
scopes,
)}) WHERE is_active = true) AS active_scopes,
(SELECT COUNT(*)::INTEGER FROM read_parquet(${JSON.stringify(
obs,
)})) AS grand_total_obs
FROM read_parquet(${JSON.stringify(scopes)}) s
LEFT JOIN read_parquet(${JSON.stringify(obs)}) o ON o.scopeid = s.id
GROUP BY s.id, s.display_name, s.is_active
HAVING COUNT(o.token) > 200
ORDER BY count DESC`,
);
56 changes: 4 additions & 52 deletions observable/src/vigilo.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,58 +15,10 @@ title: Vigilo — Vue globale
</div>

```js
import { initVigiloDB } from "./components/vigilo-db.js";
```

```js
const _vigiBase = "https://pub-6526c18d68154746a16baf2f76a38544.r2.dev/vigilo";
const { db, conn } = await initVigiloDB(_vigiBase, invalidation);

const _statsResult = await conn.query(`
SELECT s.id, s.display_name, s.is_active,
COUNT(o.token)::INTEGER AS count,
MIN(o.ts) AS first_ts, MAX(o.ts) AS last_ts,
(SELECT COUNT(*)::INTEGER FROM read_parquet('scopes.parquet')) AS total_scopes,
(SELECT COUNT(*)::INTEGER FROM read_parquet('scopes.parquet') WHERE is_active = true) AS active_scopes,
(SELECT COUNT(*)::INTEGER FROM read_parquet('observations.parquet')) AS grand_total_obs
FROM read_parquet('scopes.parquet') s
LEFT JOIN read_parquet('observations.parquet') o ON o.scopeid = s.id
GROUP BY s.id, s.display_name, s.is_active
HAVING COUNT(o.token) > 200
ORDER BY count DESC
`);
const stats = _statsResult.toArray().map((r) => ({
id: r.id,
display_name: r.display_name,
is_active: r.is_active,
count: Number(r.count),
first_ts: r.first_ts !== null ? Number(r.first_ts) : null,
last_ts: r.last_ts !== null ? Number(r.last_ts) : null,
total_scopes: Number(r.total_scopes),
active_scopes: Number(r.active_scopes),
grand_total_obs: Number(r.grand_total_obs),
}));

const _catResult = await conn.query(`
SELECT s.id AS scope_id, s.display_name AS scope_name,
c.name AS category, c.color, COUNT(*)::INTEGER AS count
FROM read_parquet('observations.parquet') o
JOIN read_parquet('scopes.parquet') s ON s.id = o.scopeid
JOIN read_parquet('categories.parquet') c ON c.id = o.catid
WHERE s.id IN (
SELECT scopeid FROM read_parquet('observations.parquet')
GROUP BY scopeid HAVING COUNT(*) > 200
)
GROUP BY s.id, s.display_name, c.name, c.color
ORDER BY s.display_name, c.name
`);
const statsByCategory = _catResult.toArray().map((r) => ({
scope_id: r.scope_id,
scope_name: r.scope_name,
category: r.category,
color: r.color,
count: Number(r.count),
}));
const [stats, statsByCategory] = await Promise.all([
FileAttachment("data/vigilo-stats.json").json(),
FileAttachment("data/vigilo-stats-by-category.json").json(),
]);
```

```js
Expand Down
Loading