ph-dev-tools
Version:
Development Tools for PHibernate
100 lines (85 loc) • 2.5 kB
text/typescript
/**
* Created by Papa on 4/25/2016.
*/
import {PropertyDocEntry} from "../../parser/DocEntry";
import {QPropertyBuilder} from "./QPropertyBuilder";
import {QRelationBuilder} from "./QRelationBuilder";
import {QBuilder} from "./../QBuilder";
import {EntityCandidate} from "../../parser/EntityCandidate";
import {QEntityFileBuilder} from "./QEntityFileBuilder";
export class QEntityBuilder implements QBuilder {
propertyBuilders:QPropertyBuilder[] = [];
relationBuilders:QRelationBuilder[] = [];
constructor(
public entity:EntityCandidate,
private fullGenerationPath:string,
private workingDirPath:string,
private fileBuilder:QEntityFileBuilder
) {
entity.docEntry.properties.forEach((
property:PropertyDocEntry
) => {
if (property.primitive) {
let propertyBuilder = new QPropertyBuilder(this, property);
this.propertyBuilders.push(propertyBuilder);
} else {
if (property.entity) {
let relationBuilder = new QRelationBuilder(this, property);
this.relationBuilders.push(relationBuilder);
} else {
throw `Unexpected PropertyDocEntry: ${property.name}`;
}
}
});
}
addImport(
importString:string
):void {
this.fileBuilder.addImport(importString);
}
build():string {
let properties = ``;
let staticProperties = ``;
let qName = `Q${this.entity.docEntry.name}`;
this.propertyBuilders.forEach((
builder:QPropertyBuilder
) => {
properties += ` ${builder.build()}\n`;
let propertyName = builder.propertyDocEntry.name;
staticProperties += ` static ${propertyName} = ${qName}.q.${propertyName};\n`;
});
let relations = ``;
let staticRelations = ``;
this.relationBuilders.forEach((
builder:QRelationBuilder
) => {
relations += ` ${builder.build()}\n`;
let relationName = builder.entityProperty.name;
staticRelations += ` static ${relationName} = ${qName}.q.${relationName};\n`;
});
let classSource = `// Entity Query Implementation
export class ${qName}
extends QEntity<${qName}> implements I${qName}
{
static q = new ${qName}(true);
// Static Field accessors
${staticProperties}
// Static Relation accessors
${staticRelations}
// Fields
${properties}
// Relations
${relations}
constructor(
isTemplate:boolean = false
) {
super(${this.entity.type}, '${this.entity.type}', isTemplate);
}
toJSON():any {
throw 'Not Implemented';
}
}
`;
return classSource;
}
}