1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package org.javagen.agile.db.util;
17
18 import org.javagen.agile.core.model.Model;
19 import org.javagen.agile.db.model.Cardinality;
20 import org.javagen.agile.db.model.Column;
21 import org.javagen.agile.db.model.ColumnReference;
22 import org.javagen.agile.db.model.FkConstraint;
23 import org.javagen.agile.db.model.FkEnum;
24 import org.javagen.agile.db.model.PkColumn;
25 import org.javagen.agile.db.model.Table;
26
27 /***
28 * Create table attributes - mostly for ease of unit testing.
29 * <p>
30 * This should ideally go in the test directory, but its left here for reuse by other modules.
31 *
32 * @author Richard Easterling
33 */
34 public class DbUtil {
35
36 public static FkConstraint createReverse(FkConstraint fkConstraint, boolean wireItUp) {
37 if (fkConstraint.getReverseFkConstraint()==null) {
38 FkEnum revFkType = FkEnum.IMPORTED.equals(fkConstraint.getFkType()) ? FkEnum.EXPORTED : FkEnum.IMPORTED;
39 boolean selfReferential = (fkConstraint.getParentTable() == fkConstraint.getTargetTable());
40
41 String revFkName = selfReferential ? fkConstraint.getName()+"_"+revFkType.toString() : fkConstraint.getName();
42
43
44 FkConstraint revFkColumn = fkConstraint.getTargetTable().lookupFkColumn(revFkName);
45 if (revFkColumn==null) {
46 revFkColumn = fkConstraint.getTargetTable().createFkColumn();
47 }
48 revFkColumn.setFkType(revFkType);
49 revFkColumn.setTargetTable(fkConstraint.getParentTable());
50 revFkColumn.setName(revFkName);
51 if (fkConstraint.getCardinality()!=null)
52 revFkColumn.setCardinality(fkConstraint.getCardinality().getReverse());
53 for(Model child : fkConstraint.getChildModels()) {
54 ColumnReference ref = (ColumnReference)child;
55 ColumnReference revRef = revFkColumn.createColumnReference();
56 revRef.setForeignColumn(ref.getLocalColumn());
57 revRef.setLocalColumn(ref.getForeignColumn());
58 if (ref.getSequenceNumber()!=null)
59 revRef.setSequenceNumber(ref.getSequenceNumber());
60 revFkColumn.addColumnReference(revRef);
61 }
62 revFkColumn.setReverseFkColumn(fkConstraint);
63 if (wireItUp) {
64 fkConstraint.setReverseFkColumn(revFkColumn);
65 fkConstraint.getTargetTable().addFkColumn(revFkColumn);
66 }
67 return revFkColumn;
68 } else {
69 return fkConstraint.getReverseFkConstraint();
70 }
71 }
72
73 /***
74 * This is a convienence method for creating test data. It creates both the local column (pk or fk)
75 * and the FK constraints (both imported and exported)
76 */
77 public static FkConstraint addFkColumn(Table localTable, String fkName, boolean isFkPk, PkColumn pkColumn, Boolean notNull, Cardinality cardinality) {
78 Column local = isFkPk ? localTable.createPkColumn() : localTable.createColumn();
79 local.setName(fkName);
80 local.setDbType(pkColumn.getDbType());
81 local.setDefaultValue(null);
82 local.setNotNull(notNull);
83 local.setColumnSize(pkColumn.getColumnSize());
84 local.setScale(pkColumn.getScale());
85
86 localTable.addColumn(local);
87 FkConstraint fkConstraint = localTable.createFkColumn();
88 fkConstraint.setName(localTable.getName()+"_"+pkColumn.getParentTable().getName()+"_RELATION");
89 fkConstraint.setFkType(FkEnum.IMPORTED);
90 fkConstraint.setTargetTable(pkColumn.getParentTable());
91 fkConstraint.setCardinality(cardinality);
92 localTable.addFkColumn(fkConstraint);
93 ColumnReference colRef = fkConstraint.addColumnReference(local, pkColumn);
94 local.put(ColumnReference.DEFAULT_MODEL_TYPE, colRef);
95 DbUtil.createReverse(fkConstraint, true);
96 return fkConstraint;
97 }
98
99
100 }