A third party ATProto appview
1import { createDataLoader } from './server/services/hydration/dataloader';
2import { dataLoaderHydrator } from './server/services/hydration/dataloader-hydrator';
3import { db } from './server/db';
4import { posts } from './shared/schema';
5import { desc } from 'drizzle-orm';
6
7async function testDataLoader() {
8 console.log('Testing DataLoader implementation...\n');
9
10 try {
11 // Get some test posts
12 const testPosts = await db
13 .select({ uri: posts.uri })
14 .from(posts)
15 .orderBy(desc(posts.createdAt))
16 .limit(10);
17
18 if (testPosts.length === 0) {
19 console.log('No posts found in database');
20 return;
21 }
22
23 const postUris = testPosts.map((p) => p.uri);
24 console.log(`Found ${postUris.length} posts to hydrate\n`);
25
26 // Create a DataLoader instance
27 const dataLoader = createDataLoader();
28
29 // Test hydration
30 console.log('Hydrating posts with DataLoader...');
31 const startTime = performance.now();
32
33 const result = await dataLoaderHydrator.hydratePosts(
34 postUris,
35 undefined, // No viewer for this test
36 dataLoader
37 );
38
39 const duration = performance.now() - startTime;
40
41 console.log(`\n✅ Hydration complete in ${duration.toFixed(2)}ms`);
42 console.log(`\nStats:`);
43 console.log(`- Posts hydrated: ${result.posts.size}`);
44 console.log(`- Authors loaded: ${result.actors.size}`);
45 console.log(`- Aggregations loaded: ${result.aggregations.size}`);
46 console.log(`- DataLoader batches: ${result.stats.dataLoaderBatches}`);
47 console.log(`- Query time: ${result.stats.queryTime.toFixed(2)}ms`);
48 console.log(`- Total time: ${result.stats.totalTime.toFixed(2)}ms`);
49
50 // Test cache hit
51 console.log('\n\nTesting cache hit (re-hydrating same posts)...');
52 const startTime2 = performance.now();
53
54 const result2 = await dataLoaderHydrator.hydratePosts(
55 postUris,
56 undefined,
57 dataLoader // Same DataLoader instance
58 );
59
60 const duration2 = performance.now() - startTime2;
61
62 console.log(`✅ Re-hydration complete in ${duration2.toFixed(2)}ms`);
63 console.log(`- Posts hydrated: ${result2.posts.size}`);
64 console.log(`- DataLoader batches: ${result2.stats.dataLoaderBatches}`);
65 console.log(
66 `Cache hit improvement: ${(((duration - duration2) / duration) * 100).toFixed(1)}% faster`
67 );
68
69 // Clean up
70 dataLoader.clearAll();
71 } catch (error) {
72 console.error('Error:', error);
73 }
74}
75
76testDataLoader().then(() => process.exit(0));