drizzle-cube
Version:
Drizzle ORM-first semantic layer with Cube.js compatibility. Type-safe analytics and dashboards with SQL injection protection.
262 lines (261 loc) • 7.9 kB
TypeScript
import { SemanticLayerCompiler, SemanticQuery, SecurityContext, QueryAnalysis } from '../server';
/**
* Calculate query complexity based on query structure
*/
export declare function calculateQueryComplexity(query: SemanticQuery): string;
/**
* Generate a unique request ID
*/
export declare function generateRequestId(): string;
/**
* Build transformed query metadata for Cube.js compatibility
*/
export declare function buildTransformedQuery(query: SemanticQuery): any;
/**
* Get database type from semantic layer
*/
export declare function getDatabaseType(semanticLayer: SemanticLayerCompiler): string;
/**
* Helper function to handle dry-run logic for all adapters
*/
export declare function handleDryRun(query: SemanticQuery, securityContext: SecurityContext, semanticLayer: SemanticLayerCompiler): Promise<{
queryType: string;
normalizedQueries: never[];
queryOrder: string[];
transformedQueries: never[];
pivotQuery: {
query: SemanticQuery;
cubes: string[];
};
sql: {
sql: string[];
params: any[];
};
complexity: string;
valid: boolean;
cubesUsed: string[];
joinType: string;
query: SemanticQuery;
funnel: {
stepCount: number;
steps: {
index: number;
name: string;
timeToConvert: string | undefined;
cube: string | undefined;
}[];
bindingKey: string | import('../server').FunnelBindingKeyMapping[];
timeDimension: string | import('../server').FunnelTimeDimensionMapping[];
includeTimeMetrics: boolean | undefined;
globalTimeWindow: string | undefined;
};
} | {
queryType: string;
normalizedQueries: never[];
queryOrder: string[];
transformedQueries: never[];
pivotQuery: {
measures: never[];
dimensions: never[];
timeDimensions: never[];
order: {};
filters: never[];
queryType: string;
joinType: string;
query: SemanticQuery;
flow: {
stepsBefore: number;
stepsAfter: number;
bindingKey: string | {
cube: string;
dimension: string;
}[];
timeDimension: string | {
cube: string;
dimension: string;
}[];
eventDimension: string;
startingStep: {
name: string;
filter?: import('../server').Filter | import('../server').Filter[];
};
};
};
sql: {
sql: string;
params: any[];
};
} | {
queryType: string;
normalizedQueries: {
cube: string;
query: {
measures: string[];
dimensions: string[];
filters: import('../server').Filter[];
timeDimensions: import('../server').TimeDimension[];
order: Record<string, "asc" | "desc">;
limit: number | undefined;
offset: number | undefined;
};
}[];
queryOrder: string[];
transformedQueries: {
cube: string;
query: {
measures: string[];
dimensions: string[];
filters: import('../server').Filter[];
timeDimensions: import('../server').TimeDimension[];
order: Record<string, "asc" | "desc">;
limit: number | undefined;
offset: number | undefined;
};
}[];
pivotQuery: {
query: SemanticQuery;
cubes: string[];
};
sql: {
sql: string[];
params: any[];
};
complexity: string;
valid: boolean;
cubesUsed: string[];
joinType: string;
query: SemanticQuery;
analysis: QueryAnalysis | undefined;
}>;
/**
* Format standard Cube.js API response
*/
export declare function formatCubeResponse(query: SemanticQuery, result: {
data: any[];
annotation?: any;
cache?: {
hit: boolean;
cachedAt?: string;
ttlMs?: number;
ttlRemainingMs?: number;
};
}, semanticLayer: SemanticLayerCompiler): {
queryType: string;
results: {
cache?: {
hit: boolean;
cachedAt?: string;
ttlMs?: number;
ttlRemainingMs?: number;
} | undefined;
query: SemanticQuery;
lastRefreshTime: string;
usedPreAggregations: {};
transformedQuery: any;
requestId: string;
annotation: any;
dataSource: string;
dbType: string;
extDbType: string;
external: boolean;
slowQuery: boolean;
data: any[];
}[];
pivotQuery: {
queryType: string;
measures?: string[];
dimensions?: string[];
filters?: Array<import('../server').Filter>;
timeDimensions?: Array<import('../server').TimeDimension>;
limit?: number;
offset?: number;
order?: Record<string, "asc" | "desc">;
fillMissingDatesValue?: number | null;
funnel?: import('../server').FunnelQueryConfig;
flow?: import('../server/types/flow').FlowQueryConfig;
};
slowQuery: boolean;
};
/**
* Format SQL string using sql-formatter with appropriate dialect
*/
export declare function formatSqlString(sqlString: string, engineType: 'postgres' | 'mysql' | 'sqlite' | 'singlestore'): string;
/**
* Format SQL generation response
*/
export declare function formatSqlResponse(query: SemanticQuery, sqlResult: {
sql: string;
params?: any[];
}): {
sql: string;
params: any[];
query: SemanticQuery;
};
/**
* Format metadata response
*/
export declare function formatMetaResponse(metadata: any): {
cubes: any;
};
/**
* Standard error response format
*/
export declare function formatErrorResponse(error: string | Error, status?: number): {
error: string;
status: number;
};
/**
* Handle batch query requests - wrapper around existing single query execution
* Executes multiple queries in parallel and returns partial success results
*
* @param queries - Array of semantic queries to execute
* @param securityContext - Security context (extracted once, shared across all queries)
* @param semanticLayer - Semantic layer compiler instance
* @returns Array of results matching input query order (successful or error results)
*/
export declare function handleBatchRequest(queries: SemanticQuery[], securityContext: SecurityContext, semanticLayer: SemanticLayerCompiler): Promise<{
results: ({
queryType: string;
results: {
cache?: {
hit: boolean;
cachedAt?: string;
ttlMs?: number;
ttlRemainingMs?: number;
} | undefined;
query: SemanticQuery;
lastRefreshTime: string;
usedPreAggregations: {};
transformedQuery: any;
requestId: string;
annotation: any;
dataSource: string;
dbType: string;
extDbType: string;
external: boolean;
slowQuery: boolean;
data: any[];
}[];
pivotQuery: {
queryType: string;
measures?: string[];
dimensions?: string[];
filters?: Array<import('../server').Filter>;
timeDimensions?: Array<import('../server').TimeDimension>;
limit?: number;
offset?: number;
order?: Record<string, "asc" | "desc">;
fillMissingDatesValue?: number | null;
funnel?: import('../server').FunnelQueryConfig;
flow?: import('../server/types/flow').FlowQueryConfig;
};
slowQuery: boolean;
success: boolean;
error?: undefined;
query?: undefined;
} | {
success: boolean;
error: string;
query: SemanticQuery;
})[];
}>;