Skip to content

Commit

Permalink
Implemented code generation for nested tables (issue #4).
Browse files Browse the repository at this point in the history
  • Loading branch information
nmihajlovski committed May 2, 2012
1 parent 6e12e96 commit 65b155d
Show file tree
Hide file tree
Showing 10 changed files with 242 additions and 48 deletions.
17 changes: 16 additions & 1 deletion src/main/java/com/tightdb/example/WorkingExample.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

import com.tightdb.generated.Employee;
import com.tightdb.generated.EmployeeTable;
import com.tightdb.lib.NestedTable;
import com.tightdb.lib.Table;

public class WorkingExample {
Expand All @@ -17,6 +18,13 @@ class employee {
byte[] photo;
Date birthdate;
Object extra;
phone phones;
}

@NestedTable
class phone {
String type;
String number;
}

public static void main(String[] args) {
Expand All @@ -29,6 +37,13 @@ public static void main(String[] args) {
System.out.println("second record: " + nikolche);
System.out.println("some column: " + john.firstName);

john.phones.get().add("mobile", "123456");
john.phones.get().add("home", "567890");

nikolche.phones.get().add("home", "13579");

System.out.println(john.phones.get().size());

display(persons);

nikolche.lastName.set("MIHAJLOVSKI");
Expand All @@ -47,7 +62,7 @@ private static void display(EmployeeTable persons) {
for (int i = 0; i < persons.size(); i++) {
Employee p = persons.at(i);
System.out.println(" - " + p.firstName.get() + " " + p.getLastName() + " " + p.getSalary() + " " + p.getDriver() + " " + p.getPhoto()
+ " " + p.getBirthdate() + " " + p.getExtra());
+ " " + p.getBirthdate() + " " + p.getExtra() + " " + p.getPhones().size() + " records");
}
} else {
System.out.println(" - the table is empty");
Expand Down
10 changes: 10 additions & 0 deletions src/main/java/com/tightdb/generated/Employee.java
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ public class Employee extends AbstractCursor<Employee> {
public final BinaryColumn<Employee, EmployeeQuery> photo;
public final DateColumn<Employee, EmployeeQuery> birthdate;
public final MixedColumn<Employee, EmployeeQuery> extra;
public final TableColumn<Employee, EmployeeQuery, PhoneTable> phones;

public Employee(TableBase table, long position) {
super(table, Employee.class, position);
Expand All @@ -29,6 +30,7 @@ public Employee(TableBase table, long position) {
photo = new BinaryColumn<Employee, EmployeeQuery>(table, this, 4, "photo");
birthdate = new DateColumn<Employee, EmployeeQuery>(table, this, 5, "birthdate");
extra = new MixedColumn<Employee, EmployeeQuery>(table, this, 6, "extra");
phones = new TableColumn<Employee, EmployeeQuery, PhoneTable>(table, this, 7, "phones", PhoneTable.class);
}

public java.lang.String getFirstName() {
Expand Down Expand Up @@ -87,4 +89,12 @@ public void setExtra(java.io.Serializable extra) {
this.extra.set(extra);
}

public PhoneTable getPhones() {
return this.phones.get();
}

public void setPhones(PhoneTable phones) {
this.phones.set(phones);
}

}
24 changes: 15 additions & 9 deletions src/main/java/com/tightdb/generated/EmployeeTable.java
Original file line number Diff line number Diff line change
Expand Up @@ -19,20 +19,24 @@ public class EmployeeTable extends AbstractTable<Employee, EmployeeView> {
public final BinaryColumn<Employee, EmployeeQuery> photo = new BinaryColumn<Employee, EmployeeQuery>(table, 4, "photo");
public final DateColumn<Employee, EmployeeQuery> birthdate = new DateColumn<Employee, EmployeeQuery>(table, 5, "birthdate");
public final MixedColumn<Employee, EmployeeQuery> extra = new MixedColumn<Employee, EmployeeQuery>(table, 6, "extra");
public final TableColumn<Employee, EmployeeQuery, PhoneTable> phones = new TableColumn<Employee, EmployeeQuery, PhoneTable>(table, 7, "phones", PhoneTable.class);

public EmployeeTable() {
super(Employee.class, EmployeeView.class);

registerStringColumn("firstName");
registerStringColumn("lastName");
registerLongColumn("salary");
registerBooleanColumn("driver");
registerBinaryColumn("photo");
registerDateColumn("birthdate");
registerMixedColumn("extra");
registrationDone();
}

@Override
protected void specifyStructure(TableSpec spec) {
registerStringColumn(spec, "firstName");
registerStringColumn(spec, "lastName");
registerLongColumn(spec, "salary");
registerBooleanColumn(spec, "driver");
registerBinaryColumn(spec, "photo");
registerDateColumn(spec, "birthdate");
registerMixedColumn(spec, "extra");
registerTableColumn(spec, "phones", new PhoneTable());
}

public Employee add(String firstName, String lastName, int salary, boolean driver, byte[] photo, Date birthdate, Object extra) {
try {
int position = size();
Expand All @@ -44,6 +48,7 @@ public Employee add(String firstName, String lastName, int salary, boolean drive
insertBinary(4, position, photo);
insertDate(5, position, birthdate);
insertMixed(6, position, extra);
insertTable(7, position);
insertDone();

return cursor(position);
Expand All @@ -62,6 +67,7 @@ public Employee insert(long position, String firstName, String lastName, int sal
insertBinary(4, position, photo);
insertDate(5, position, birthdate);
insertMixed(6, position, extra);
insertTable(7, position);
insertDone();

return cursor(position);
Expand Down
40 changes: 40 additions & 0 deletions src/main/java/com/tightdb/generated/Phone.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/* This file was automatically generated by TightDB. */

package com.tightdb.generated;


import com.tightdb.*;
import com.tightdb.lib.*;

/**
* This class represents a TightDB cursor and was automatically generated.
*/
public class Phone extends AbstractCursor<Phone> {

public final StringColumn<Phone, PhoneQuery> type;
public final StringColumn<Phone, PhoneQuery> number;

public Phone(TableBase table, long position) {
super(table, Phone.class, position);

type = new StringColumn<Phone, PhoneQuery>(table, this, 0, "type");
number = new StringColumn<Phone, PhoneQuery>(table, this, 1, "number");
}

public java.lang.String getType() {
return this.type.get();
}

public void setType(java.lang.String type) {
this.type.set(type);
}

public java.lang.String getNumber() {
return this.number.get();
}

public void setNumber(java.lang.String number) {
this.number.set(number);
}

}
14 changes: 14 additions & 0 deletions src/main/java/com/tightdb/generated/PhoneQuery.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
/* This file was automatically generated by TightDB. */

package com.tightdb.generated;


import com.tightdb.*;
import com.tightdb.lib.*;

/**
* This class represents a TightDB query and was automatically generated.
*/
public class PhoneQuery extends AbstractQuery {

}
57 changes: 57 additions & 0 deletions src/main/java/com/tightdb/generated/PhoneTable.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
/* This file was automatically generated by TightDB. */

package com.tightdb.generated;


import com.tightdb.*;
import com.tightdb.lib.*;

/**
* This class represents a TightDB table and was automatically generated.
*/
public class PhoneTable extends AbstractTable<Phone, PhoneView> {

public final StringColumn<Phone, PhoneQuery> type = new StringColumn<Phone, PhoneQuery>(table, 0, "type");
public final StringColumn<Phone, PhoneQuery> number = new StringColumn<Phone, PhoneQuery>(table, 1, "number");

public PhoneTable() {
super(Phone.class, PhoneView.class);
}

@Override
protected void specifyStructure(TableSpec spec) {
registerStringColumn(spec, "type");
registerStringColumn(spec, "number");
}

public Phone add(String type, String number) {
try {
int position = size();

insertString(0, position, type);
insertString(1, position, number);
insertDone();

return cursor(position);
} catch (Exception e) {
throw addRowException(e);
}

}

public Phone insert(long position, String type, String number) {
try {
insertString(0, position, type);
insertString(1, position, number);
insertDone();

return cursor(position);
} catch (Exception e) {
throw insertRowException(e);
}


}


}
14 changes: 14 additions & 0 deletions src/main/java/com/tightdb/generated/PhoneView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
/* This file was automatically generated by TightDB. */

package com.tightdb.generated;


import com.tightdb.*;
import com.tightdb.lib.*;

/**
* This class represents a TightDB view and was automatically generated.
*/
public class PhoneView extends AbstractView<Phone, PhoneView> {

}
48 changes: 37 additions & 11 deletions src/main/java/com/tightdb/generator/CodeGenerator.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
package com.tightdb.generator;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.jannocessor.collection.Power;
import org.jannocessor.collection.api.PowerList;
import org.jannocessor.collection.api.PowerMap;
import org.jannocessor.collection.api.PowerSet;
import org.jannocessor.model.JavaElement;
import org.jannocessor.model.executable.JavaMethod;
import org.jannocessor.model.structure.AbstractJavaClass;
import org.jannocessor.model.structure.JavaClass;
import org.jannocessor.model.structure.JavaMetadata;
import org.jannocessor.model.type.JavaType;
import org.jannocessor.model.util.Methods;
import org.jannocessor.model.util.New;
Expand All @@ -18,16 +20,23 @@
import org.jannocessor.processor.api.CodeProcessor;
import org.jannocessor.processor.api.ProcessingContext;

import com.tightdb.lib.NestedTable;
import com.tightdb.lib.Table;

public class CodeGenerator implements CodeProcessor<AbstractJavaClass> {

private static final boolean DEBUG_MODE = true;

private final static PowerSet<String> NUM_TYPES = Power.set("long", "int", "byte", "short", "Long", "Integer", "Byte", "Short");
private final static PowerSet<String> OTHER_TYPES = Power.set("String", "Date");

private Map<String, AbstractJavaClass> tables = new HashMap<String, AbstractJavaClass>();
private Map<String, AbstractJavaClass> subtables = new HashMap<String, AbstractJavaClass>();

@Override
public void process(PowerList<AbstractJavaClass> classes, ProcessingContext context) {
context.getLogger().info("Processing {} classes", classes.size());
prepareTables(classes, context);

for (AbstractJavaClass model : classes) {
PowerList<JavaField> fields = model.getFields();
Expand All @@ -47,7 +56,10 @@ public void process(PowerList<AbstractJavaClass> classes, ProcessingContext cont
JavaType type = getFieldType(field);
JavaField f = New.field(type, field.getName().getText());

Map<String, ? extends Object> fieldAttrs = Power.map("index", index++, "columnType", columnType);
boolean isSubtable = isNestedTable(type);
String subtable = isSubtable ? type.getSimpleName().getCapitalized() + "Table" : null;
PowerMap<String, ? extends Object> fieldAttrs = Power.map("index", index++, "columnType", columnType, "isSubtable", isSubtable).set(
"subtable", subtable);
f.getCode().setAttributes(fieldAttrs);
columns.add(f);
}
Expand All @@ -68,7 +80,9 @@ public void process(PowerList<AbstractJavaClass> classes, ProcessingContext cont
List<JavaParameter> addParams = Power.list();

for (JavaField field : fields) {
addParams.add(New.parameter(field.getType(), field.getName().getText()));
if (!isNestedTable(field.getType())) {
addParams.add(New.parameter(field.getType(), field.getName().getText()));
}
}

JavaMethod add = New.method(Methods.PUBLIC, New.type(entity), "add", addParams);
Expand All @@ -81,7 +95,9 @@ public void process(PowerList<AbstractJavaClass> classes, ProcessingContext cont
insertParams.add(New.parameter(long.class, "position"));

for (JavaField field : fields) {
insertParams.add(New.parameter(field.getType(), field.getName().getText()));
if (!isNestedTable(field.getType())) {
insertParams.add(New.parameter(field.getType(), field.getName().getText()));
}
}

JavaMethod insert = New.method(Methods.PUBLIC, New.type(entity), "insert", insertParams);
Expand Down Expand Up @@ -118,6 +134,22 @@ public void process(PowerList<AbstractJavaClass> classes, ProcessingContext cont

}

private void prepareTables(PowerList<AbstractJavaClass> classes, ProcessingContext context) {
for (AbstractJavaClass model : classes) {
String name = model.getQualifiedName().getText();
for (JavaMetadata metadata : model.getAllMetadata()) {
Class<?> annotation = metadata.getAnnotation().getTypeClass();
if (Table.class.equals(annotation)) {
context.getLogger().info("- detected root table {}, annotated: {}", name, annotation);
tables.put(name, model);
} else if (NestedTable.class.equals(annotation)) {
context.getLogger().info("- detected nested table {}, annotated: {}", name, annotation);
subtables.put(name, model);
}
}
}
}

private String getColumnType(JavaField field) {
String type = field.getType().getSimpleName().getText();

Expand All @@ -137,7 +169,7 @@ private String getColumnType(JavaField field) {
}

private boolean isNestedTable(JavaType type) {
return false;
return subtables.containsKey(type.getCanonicalName());
}

private JavaType getFieldType(JavaField field) {
Expand All @@ -153,10 +185,4 @@ private JavaType getFieldType(JavaField field) {
return type;
}

public void processTables(PowerList<JavaElement> tables) {
}

public void processSubtables(PowerList<JavaElement> subtables) {
}

}
Loading

0 comments on commit 65b155d

Please sign in to comment.