git-subtree-dir: vendor/ruvector git-subtree-split: b64c21726f2bb37286d9ee36a7869fef60cc6900
114 lines
4.7 KiB
JavaScript
114 lines
4.7 KiB
JavaScript
#!/usr/bin/env node
|
|
/**
|
|
* SQL Test Script - Test CREATE TABLE and SQL operations in WASM
|
|
*/
|
|
|
|
import { readFile } from 'fs/promises';
|
|
import { fileURLToPath } from 'url';
|
|
import { dirname, join } from 'path';
|
|
|
|
const __filename = fileURLToPath(import.meta.url);
|
|
const __dirname = dirname(__filename);
|
|
|
|
async function main() {
|
|
console.log('╔════════════════════════════════════════════════════════════╗');
|
|
console.log('║ RvLite WASM SQL Test Suite ║');
|
|
console.log('╚════════════════════════════════════════════════════════════╝\n');
|
|
|
|
// Load WASM
|
|
const wasmPath = join(__dirname, '../public/pkg/rvlite_bg.wasm');
|
|
const wasmBytes = await readFile(wasmPath);
|
|
|
|
const { default: initRvLite, RvLite, RvLiteConfig } = await import('../public/pkg/rvlite.js');
|
|
await initRvLite(wasmBytes);
|
|
console.log('WASM loaded successfully!\n');
|
|
|
|
const config = new RvLiteConfig(384);
|
|
const db = new RvLite(config);
|
|
|
|
const tests = [];
|
|
|
|
function test(name, fn) {
|
|
try {
|
|
fn();
|
|
tests.push({ name, passed: true });
|
|
console.log(` \x1b[32m✓\x1b[0m ${name}`);
|
|
} catch (error) {
|
|
tests.push({ name, passed: false, error: error.message });
|
|
console.log(` \x1b[31m✗\x1b[0m ${name}`);
|
|
console.log(` Error: ${error.message}`);
|
|
}
|
|
}
|
|
|
|
console.log('═══════════════════════════════════════════════════════════════');
|
|
console.log('SQL Parser Tests');
|
|
console.log('═══════════════════════════════════════════════════════════════');
|
|
|
|
// Test 1: CREATE TABLE with VECTOR column (3-dimensional for test)
|
|
test('CREATE TABLE with VECTOR', () => {
|
|
const result = db.sql("CREATE TABLE docs (id TEXT, content TEXT, embedding VECTOR(3))");
|
|
console.log(' Result:', JSON.stringify(result));
|
|
});
|
|
|
|
// Test 2: INSERT with correct vector dimensions
|
|
test('INSERT INTO table', () => {
|
|
const result = db.sql("INSERT INTO docs (id, content, embedding) VALUES ('doc1', 'hello world', [1.0, 2.0, 3.0])");
|
|
console.log(' Result:', JSON.stringify(result));
|
|
});
|
|
|
|
// Test 3: INSERT another vector
|
|
test('INSERT second vector', () => {
|
|
const result = db.sql("INSERT INTO docs (id, content, embedding) VALUES ('doc2', 'test content', [4.0, 5.0, 6.0])");
|
|
console.log(' Result:', JSON.stringify(result));
|
|
});
|
|
|
|
// Test 4: Vector search with L2 distance
|
|
test('Vector search with L2 distance', () => {
|
|
const result = db.sql("SELECT * FROM docs ORDER BY embedding <-> [1.0, 2.0, 3.0] LIMIT 5");
|
|
console.log(' Result:', JSON.stringify(result));
|
|
});
|
|
|
|
// Test 5: Vector search with cosine distance
|
|
test('Vector search with cosine distance', () => {
|
|
const result = db.sql("SELECT * FROM docs ORDER BY embedding <=> [0.5, 0.5, 0.5] LIMIT 5");
|
|
console.log(' Result:', JSON.stringify(result));
|
|
});
|
|
|
|
// Test 6: Vector search with filter
|
|
test('Vector search with filter', () => {
|
|
const result = db.sql("SELECT * FROM docs WHERE id = 'doc1' ORDER BY embedding <-> [1.0, 2.0, 3.0] LIMIT 5");
|
|
console.log(' Result:', JSON.stringify(result));
|
|
});
|
|
|
|
// Test 7: DROP TABLE
|
|
test('DROP TABLE', () => {
|
|
const result = db.sql("DROP TABLE docs");
|
|
console.log(' Result:', JSON.stringify(result));
|
|
});
|
|
|
|
// Cleanup
|
|
db.free();
|
|
|
|
// Summary
|
|
console.log('\n╔════════════════════════════════════════════════════════════╗');
|
|
console.log('║ TEST SUMMARY ║');
|
|
console.log('╚════════════════════════════════════════════════════════════╝\n');
|
|
|
|
const passed = tests.filter(t => t.passed).length;
|
|
const failed = tests.filter(t => !t.passed).length;
|
|
|
|
console.log(` Total: ${tests.length} tests`);
|
|
console.log(` \x1b[32mPassed: ${passed}\x1b[0m`);
|
|
console.log(` \x1b[31mFailed: ${failed}\x1b[0m`);
|
|
|
|
if (failed > 0) {
|
|
console.log('\n Failed tests:');
|
|
tests.filter(t => !t.passed).forEach(t => {
|
|
console.log(` - ${t.name}: ${t.error}`);
|
|
});
|
|
process.exit(1);
|
|
}
|
|
}
|
|
|
|
main().catch(console.error);
|