import { MetadataChunk, ChunkingContext } from './types';
import { ChunkerFactory } from './factory';
import logger from '../utils/logger';
export class MetadataProcessor {
async processMetadata(
metadata: any,
metadataType: string,
orgId: string
): Promise<MetadataChunk[]> {
try {
const context: ChunkingContext = {
orgId,
metadataType,
originalMetadata: metadata
};
const chunker = ChunkerFactory.getChunker(metadataType, context);
const chunks = chunker.chunkMetadata(metadata);
logger.info(`Processed ${metadataType} ${metadata.fullName || metadata.name} into ${chunks.length} chunks`);
return this.enrichChunks(chunks, metadataType);
} catch (error) {
logger.error(`Failed to process metadata ${metadata.fullName || metadata.name}`, { error });
throw error;
}
}
private async enrichChunks(chunks: MetadataChunk[], metadataType: string): Promise<MetadataChunk[]> {
return chunks.map(chunk => this.enrichChunk(chunk));
}
private enrichChunk(chunk: MetadataChunk): MetadataChunk {
// Extract additional symbols based on content patterns
const additionalSymbols = this.extractAdvancedSymbols(chunk.content);
// Merge with existing symbols, removing duplicates
const allSymbols = [...new Set([...chunk.symbols, ...additionalSymbols])];
return {
...chunk,
symbols: allSymbols
};
}
private extractAdvancedSymbols(content: string): string[] {
const symbols = new Set<string>();
// Extract DML operations
const dmlMatches = content.match(/\b(insert|update|delete|undelete|upsert)\s+\w+/gi) || [];
dmlMatches.forEach(match => symbols.add(match.toLowerCase()));
// Extract SOQL queries - find SELECT statements
const soqlMatches = content.match(/SELECT\s+[\s\S]*?\s+FROM\s+(\w+)/gi) || [];
soqlMatches.forEach(match => {
const fromMatch = match.match(/FROM\s+(\w+)/i);
if (fromMatch) {
symbols.add(fromMatch[1]);
}
});
// Extract Schema references
const schemaMatches = content.match(/Schema\.SObjectType\.(\w+)/g) || [];
schemaMatches.forEach(match => {
const objectMatch = match.match(/Schema\.SObjectType\.(\w+)/);
if (objectMatch) {
symbols.add(objectMatch[1]);
}
});
// Extract System/UserInfo methods
const systemMatches = content.match(/\b(System\.\w+|UserInfo\.\w+)/g) || [];
systemMatches.forEach(match => symbols.add(match));
return Array.from(symbols);
}
}