@agentdb/sdk
Version:
JavaScript SDK for AgentDB database service
196 lines (174 loc) ⢠7 kB
JavaScript
/**
* Analytics with DuckDB Example
*
* This example demonstrates using DuckDB for analytics workloads,
* including creating analytical tables, inserting data, and running
* complex analytical queries.
*/
import { DatabaseService } from '../index.js';
async function analyticsExample() {
const BASE_URL = 'https://api.agentdb.dev';
const API_KEY = 'your-api-key-here';
const TOKEN = 'your-uuid-token-here';
try {
console.log('=== Analytics with DuckDB Example ===\n');
// Create service and DuckDB connection
const service = new DatabaseService(BASE_URL, API_KEY);
const analytics = service.connect(TOKEN, 'analytics-db', 'duckdb');
// Create analytics tables
console.log('1. Creating analytics tables...');
await analytics.execute([
{
sql: `CREATE TABLE IF NOT EXISTS events (
id UUID DEFAULT gen_random_uuid(),
timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
event_type VARCHAR(50),
user_id VARCHAR(50),
session_id VARCHAR(50),
properties JSON,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)`,
params: []
},
{
sql: `CREATE TABLE IF NOT EXISTS users (
user_id VARCHAR(50) PRIMARY KEY,
signup_date DATE,
plan_type VARCHAR(20),
country VARCHAR(50)
)`,
params: []
}
]);
// Insert sample user data
console.log('2. Inserting sample user data...');
const users = [
['user_001', '2024-01-15', 'premium', 'USA'],
['user_002', '2024-01-16', 'basic', 'Canada'],
['user_003', '2024-01-17', 'premium', 'UK'],
['user_004', '2024-01-18', 'basic', 'Germany'],
['user_005', '2024-01-19', 'premium', 'France']
];
const userStatements = users.map(([userId, signupDate, planType, country]) => ({
sql: 'INSERT INTO users (user_id, signup_date, plan_type, country) VALUES (?, ?, ?, ?)',
params: [userId, signupDate, planType, country]
}));
await analytics.execute(userStatements);
// Insert sample event data
console.log('3. Inserting sample event data...');
const events = [
['page_view', 'user_001', 'session_001', '{"page": "/dashboard", "duration": 45}'],
['click', 'user_001', 'session_001', '{"element": "button", "action": "export"}'],
['page_view', 'user_002', 'session_002', '{"page": "/reports", "duration": 120}'],
['download', 'user_002', 'session_002', '{"file": "report.pdf", "size": 1024}'],
['page_view', 'user_003', 'session_003', '{"page": "/settings", "duration": 30}'],
['click', 'user_003', 'session_003', '{"element": "toggle", "action": "enable_notifications"}'],
['page_view', 'user_001', 'session_004', '{"page": "/billing", "duration": 90}'],
['purchase', 'user_001', 'session_004', '{"amount": 99.99, "currency": "USD"}']
];
const eventStatements = events.map(([eventType, userId, sessionId, properties]) => ({
sql: 'INSERT INTO events (event_type, user_id, session_id, properties) VALUES (?, ?, ?, ?)',
params: [eventType, userId, sessionId, properties]
}));
await analytics.execute(eventStatements);
// Run analytical queries
console.log('4. Running analytical queries...\n');
// Query 1: Event summary by type
console.log('š Event Summary by Type:');
const eventSummary = await analytics.execute({
sql: `SELECT
event_type,
COUNT(*) as total_events,
COUNT(DISTINCT user_id) as unique_users,
COUNT(DISTINCT session_id) as unique_sessions
FROM events
GROUP BY event_type
ORDER BY total_events DESC`,
params: []
});
console.table(eventSummary.results[0].data);
// Query 2: User activity by plan type
console.log('\nš User Activity by Plan Type:');
const planActivity = await analytics.execute({
sql: `SELECT
u.plan_type,
COUNT(DISTINCT e.user_id) as active_users,
COUNT(e.id) as total_events,
ROUND(COUNT(e.id)::FLOAT / COUNT(DISTINCT e.user_id), 2) as avg_events_per_user
FROM users u
LEFT JOIN events e ON u.user_id = e.user_id
GROUP BY u.plan_type
ORDER BY total_events DESC`,
params: []
});
console.table(planActivity.results[0].data);
// Query 3: Geographic distribution
console.log('\nš Geographic Distribution:');
const geoDistribution = await analytics.execute({
sql: `SELECT
u.country,
COUNT(DISTINCT u.user_id) as total_users,
COUNT(e.id) as total_events,
COALESCE(ROUND(COUNT(e.id)::FLOAT / COUNT(DISTINCT u.user_id), 2), 0) as avg_events_per_user
FROM users u
LEFT JOIN events e ON u.user_id = e.user_id
GROUP BY u.country
ORDER BY total_users DESC`,
params: []
});
console.table(geoDistribution.results[0].data);
// Query 4: Advanced JSON analysis
console.log('\nš Page View Analysis (JSON properties):');
const pageAnalysis = await analytics.execute({
sql: `SELECT
properties->>'page' as page,
COUNT(*) as views,
ROUND(AVG(CAST(properties->>'duration' AS INTEGER)), 2) as avg_duration_seconds
FROM events
WHERE event_type = 'page_view'
AND properties->>'page' IS NOT NULL
AND properties->>'duration' IS NOT NULL
GROUP BY properties->>'page'
ORDER BY views DESC`,
params: []
});
console.table(pageAnalysis.results[0].data);
// Query 5: Time-based analysis
console.log('\nš Daily Event Trends:');
const dailyTrends = await analytics.execute({
sql: `SELECT
DATE_TRUNC('day', timestamp) as date,
COUNT(*) as total_events,
COUNT(DISTINCT user_id) as unique_users,
COUNT(DISTINCT session_id) as unique_sessions
FROM events
GROUP BY DATE_TRUNC('day', timestamp)
ORDER BY date`,
params: []
});
console.table(dailyTrends.results[0].data);
// Query 6: Revenue analysis (for purchase events)
console.log('\nš Revenue Analysis:');
const revenueAnalysis = await analytics.execute({
sql: `SELECT
COUNT(*) as total_purchases,
SUM(CAST(properties->>'amount' AS DECIMAL(10,2))) as total_revenue,
AVG(CAST(properties->>'amount' AS DECIMAL(10,2))) as avg_purchase_amount,
MIN(CAST(properties->>'amount' AS DECIMAL(10,2))) as min_purchase,
MAX(CAST(properties->>'amount' AS DECIMAL(10,2))) as max_purchase
FROM events
WHERE event_type = 'purchase'
AND properties->>'amount' IS NOT NULL`,
params: []
});
console.table(revenueAnalysis.results[0].data);
console.log('\n=== Analytics Example Complete ===');
} catch (error) {
console.error('Error in analytics example:', error.message);
if (error.statusCode) {
console.error('Status code:', error.statusCode);
}
}
}
// Run the example
analyticsExample();