ph-dev-tools
Version:
Development Tools for PHibernate
94 lines (92 loc) • 4.33 kB
JavaScript
;
/**
* Created by Papa on 4/26/2016.
*/
const QBuilder_1 = require("./../QBuilder");
const QEntityBuilder_1 = require("./QEntityBuilder");
const pathResolver_1 = require("../../resolve/pathResolver");
const IQEntityBuilder_1 = require("./IQEntityBuilder");
class QEntityFileBuilder {
constructor(entity, fullGenerationPath, workingDirPath) {
this.entity = entity;
this.fullGenerationPath = fullGenerationPath;
this.workingDirPath = workingDirPath;
this.importStatements = [];
this.qEntityBuilder = new QEntityBuilder_1.QEntityBuilder(entity, fullGenerationPath, workingDirPath, this);
this.iqEntityBuilder = new IQEntityBuilder_1.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 = pathResolver_1.resolveRelativePath(fullGenerationPath, entity.path);
this.addImport(entity.type, entityRelativePath);
this.addImport('PH, ProxyGenerator', 'phibernate');
}
build() {
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;
}
buildProxySetup() {
let proxySetup = '';
let clazz = this.entity.docEntry.name;
this.qEntityBuilder.propertyBuilders.forEach((propertyBuilder //
) => {
let docEntry = propertyBuilder.propertyDocEntry;
let fieldType = QBuilder_1.getPropertyFieldType(docEntry);
let propertyName = docEntry.name;
proxySetup += `ProxyGenerator.setupEntityField(${clazz}, '${propertyName}', FieldType.${fieldType});\n`;
});
this.qEntityBuilder.relationBuilders.forEach((relationBuilder //
) => {
let docEntry = relationBuilder.entityProperty;
let fieldType = QBuilder_1.getRelationFieldType(docEntry);
let propertyName = docEntry.name;
proxySetup += `ProxyGenerator.setupEntityRelation(${clazz}, '${propertyName}', RelationType.${fieldType}, ${docEntry.entity.type});\n`;
});
return proxySetup;
}
buildImports() {
let imports = ``;
this.importStatements.forEach((importStatement) => {
imports += '\n' + importStatement;
});
this.qEntityBuilder.relationBuilders.forEach((builder) => {
if (this.entity !== builder.entityProperty.entity) {
let entityRelativePath = pathResolver_1.resolveRelativePath(this.fullGenerationPath, builder.entityProperty.entity.path);
let type = builder.entityProperty.entity.type;
let typeImportStatement = `import {${type}} from '${entityRelativePath}';`;
imports += '\n' + typeImportStatement;
let qEntityRelativePath = pathResolver_1.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, fileName = `./${classString}`) {
let importStatement = `import {${classString}} from '${fileName}';`;
this.importStatements.push(importStatement);
}
}
exports.QEntityFileBuilder = QEntityFileBuilder;
//# sourceMappingURL=QEntityFileBuilder.js.map