Skip to content

Commit 177ab3e

Browse files
committed
重构 ObjectQL 引擎以支持多个存储驱动,更新驱动注册和初始化逻辑
1 parent 505112a commit 177ab3e

File tree

2 files changed

+65
-14
lines changed

2 files changed

+65
-14
lines changed

examples/objectql/src/index.ts

Lines changed: 56 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -11,28 +11,70 @@ import { DriverInterface, DriverOptions, QueryAST } from '@objectstack/spec';
1111
* 4. Driver Delegation
1212
*/
1313
export class ObjectQL {
14-
constructor(private driver: DriverInterface) {
15-
console.log(`[ObjectQL] Initialized with driver: ${driver.name} v${driver.version}`);
14+
private drivers = new Map<string, DriverInterface>();
15+
private defaultDriver: string | null = null;
16+
17+
constructor() {
18+
console.log(`[ObjectQL] Engine Instance Created`);
19+
}
20+
21+
/**
22+
* Register a new storage driver
23+
*/
24+
registerDriver(driver: DriverInterface, isDefault: boolean = false) {
25+
if (this.drivers.has(driver.name)) {
26+
console.warn(`[ObjectQL] Driver ${driver.name} is already registered. Skipping.`);
27+
return;
28+
}
29+
30+
this.drivers.set(driver.name, driver);
31+
console.log(`[ObjectQL] Registered driver: ${driver.name} v${driver.version}`);
32+
33+
if (isDefault || this.drivers.size === 1) {
34+
this.defaultDriver = driver.name;
35+
}
36+
}
37+
38+
/**
39+
* Helper to get the target driver
40+
*/
41+
private getDriver(object: string): DriverInterface {
42+
// TODO: Look up Object definition to see if it specifies a specific datasource/driver
43+
// For now, always return default
44+
if (!this.defaultDriver) {
45+
throw new Error('[ObjectQL] No drivers registered!');
46+
}
47+
return this.drivers.get(this.defaultDriver)!;
1648
}
1749

1850
/**
19-
* Initialize the engine
51+
* Initialize the engine and all registered drivers
2052
*/
2153
async init() {
22-
await this.driver.connect();
54+
console.log('[ObjectQL] Initializing drivers...');
55+
for (const [name, driver] of this.drivers) {
56+
try {
57+
await driver.connect();
58+
} catch (e) {
59+
console.error(`[ObjectQL] Failed to connect driver ${name}`, e);
60+
}
61+
}
2362
// In a real app, we would sync schemas here
2463
}
2564

2665
async destroy() {
27-
await this.driver.disconnect();
66+
for (const driver of this.drivers.values()) {
67+
await driver.disconnect();
68+
}
2869
}
2970

3071
// ============================================
3172
// Data Access Methods
3273
// ============================================
3374

3475
async find(object: string, filters: any = {}, options?: DriverOptions) {
35-
console.log(`[ObjectQL] Finding ${object}...`);
76+
const driver = this.getDriver(object);
77+
console.log(`[ObjectQL] Finding ${object} on ${driver.name}...`);
3678

3779
// Transform simplified filters to QueryAST
3880
// This is a simplified "Mock" transform.
@@ -45,27 +87,30 @@ export class ObjectQL {
4587
sort: filters.sort || []
4688
};
4789

48-
return this.driver.find(object, ast, options);
90+
return driver.find(object, ast, options);
4991
}
5092

5193
async insert(object: string, data: Record<string, any>, options?: DriverOptions) {
52-
console.log(`[ObjectQL] Creating ${object}...`);
94+
const driver = this.getDriver(object);
95+
console.log(`[ObjectQL] Creating ${object} on ${driver.name}...`);
5396
// 1. Validate Schema
5497
// 2. Run "Before Insert" Triggers
5598

56-
const result = await this.driver.create(object, data, options);
99+
const result = await driver.create(object, data, options);
57100

58101
// 3. Run "After Insert" Triggers
59102
return result;
60103
}
61104

62105
async update(object: string, id: string, data: Record<string, any>, options?: DriverOptions) {
106+
const driver = this.getDriver(object);
63107
console.log(`[ObjectQL] Updating ${object} ${id}...`);
64-
return this.driver.update(object, id, data, options);
108+
return driver.update(object, id, data, options);
65109
}
66110

67111
async delete(object: string, id: string, options?: DriverOptions) {
112+
const driver = this.getDriver(object);
68113
console.log(`[ObjectQL] Deleting ${object} ${id}...`);
69-
return this.driver.delete(object, id, options);
114+
return driver.delete(object, id, options);
70115
}
71116
}

examples/server/src/kernel/engine.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,15 @@ export class DataEngine {
77
private ql: ObjectQL;
88

99
constructor() {
10-
// In a real startup sequence, driver choice involves config loading
11-
const driver = new InMemoryDriver();
12-
this.ql = new ObjectQL(driver);
10+
this.ql = new ObjectQL();
11+
12+
// 1. Initialize Driver (Usually loaded from plugins or config)
13+
const memoryDriver = new InMemoryDriver();
14+
15+
// 2. Register Driver to Engine
16+
this.ql.registerDriver(memoryDriver, true); // Set as default
17+
18+
// 3. Start Engine
1319
this.ql.init().catch(console.error);
1420

1521
// Seed some data for demo

0 commit comments

Comments
 (0)