UNPKG

@agentdb/sdk

Version:

JavaScript SDK for AgentDB database service

196 lines (174 loc) • 7 kB
/** * 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();