ph-dev-tools
Version:
Development Tools for PHibernate
125 lines (105 loc) • 4.23 kB
text/typescript
/**
* Created by Papa on 4/26/2016.
*/
import {QBuilder, getPropertyFieldType, getRelationFieldType} from "./../QBuilder";
import {QEntityBuilder} from "./QEntityBuilder";
import {EntityCandidate} from "../../parser/EntityCandidate";
import {resolveRelativePath, resolveRelativeEntityPath} from "../../resolve/pathResolver";
import {QRelationBuilder} from "./QRelationBuilder";
import {QPropertyBuilder} from "./QPropertyBuilder";
import {PropertyDocEntry} from "../../parser/DocEntry";
import {IQEntityBuilder} from "./IQEntityBuilder";
export class QEntityFileBuilder implements QBuilder {
qEntityBuilder:QEntityBuilder;
iqEntityBuilder:IQEntityBuilder;
importStatements:string[] = [];
constructor(
private entity:EntityCandidate,
private fullGenerationPath:string,
private workingDirPath:string
) {
this.qEntityBuilder = new QEntityBuilder(entity, fullGenerationPath, workingDirPath, this);
this.iqEntityBuilder = new IQEntityBuilder(entity, this.qEntityBuilder);
this.addImport(`IEntity, IQEntity, IEntityQuery, QEntity, FieldType,
IQBooleanField, QBooleanField,
IQDateField, QDateField,
IQNumberField, QNumberField,
IQStringField, QStringField,
IBooleanOperation,JSONBooleanOperation,
IDateOperation,JSONDateOperation,
INumberOperation,JSONNumberOperation,
IStringOperation,JSONStringOperation,
RelationType, IQRelation, QRelation`, 'querydsl-typescript');
let entityRelativePath = resolveRelativePath(fullGenerationPath, entity.path);
this.addImport(entity.type, entityRelativePath);
this.addImport('PH, ProxyGenerator', 'phibernate');
}
build():string {
let imports = this.buildImports();
let proxySetup = this.buildProxySetup();
let interfaceSource = this.iqEntityBuilder.build();
let classSource = this.qEntityBuilder.build();
let entityName = this.entity.docEntry.name;
let fileSource = `${imports}
// Entity Proxy setup
${proxySetup}
${interfaceSource}
export interface I${entityName}Query extends IEntityQuery<I${entityName}> {
}
${classSource}
PH.addQEntity(${entityName}, Q${entityName}.q);
`;
return fileSource;
}
private buildProxySetup():string {
let proxySetup = '';
let clazz = this.entity.docEntry.name;
this.qEntityBuilder.propertyBuilders.forEach((
propertyBuilder:QPropertyBuilder //
) => {
let docEntry = propertyBuilder.propertyDocEntry;
let fieldType = getPropertyFieldType(docEntry);
let propertyName = docEntry.name;
proxySetup += `ProxyGenerator.setupEntityField(${clazz}, '${propertyName}', FieldType.${fieldType});\n`;
});
this.qEntityBuilder.relationBuilders.forEach((
relationBuilder:QRelationBuilder //
) => {
let docEntry = relationBuilder.entityProperty;
let fieldType = getRelationFieldType(docEntry);
let propertyName = docEntry.name;
proxySetup += `ProxyGenerator.setupEntityRelation(${clazz}, '${propertyName}', RelationType.${fieldType}, ${docEntry.entity.type});\n`;
});
return proxySetup;
}
private buildImports():string {
let imports = ``;
this.importStatements.forEach((
importStatement:string
) => {
imports += '\n' + importStatement;
});
this.qEntityBuilder.relationBuilders.forEach((
builder:QRelationBuilder
) => {
if (this.entity !== builder.entityProperty.entity) {
let entityRelativePath = resolveRelativePath(this.fullGenerationPath, builder.entityProperty.entity.path);
let type = builder.entityProperty.entity.type;
let typeImportStatement = `import {${type}} from '${entityRelativePath}';`;
imports += '\n' + typeImportStatement;
let qEntityRelativePath = resolveRelativeEntityPath(this.entity, builder.entityProperty.entity);
let qType = 'Q' + builder.entityProperty.entity.type;
let qTypeImportStatement = `import {I${type}, I${qType}, ${qType}} from '${qEntityRelativePath}';`;
imports += '\n' + qTypeImportStatement;
}
});
return imports;
}
addImport(
classString:string,
fileName:string = `./${classString}`
):void {
let importStatement = `import {${classString}} from '${fileName}';`;
this.importStatements.push(importStatement);
}
}