r2386 - trunk/topia-persistence/src/main/java/org/nuiton/topia/generator
Author: tchemit Date: 2011-12-27 15:37:01 +0100 (Tue, 27 Dec 2011) New Revision: 2386 Url: http://nuiton.org/repositories/revision/topia/2386 Log: Evolution #1866: New stereotype tableAssocIndex to generate index on FK Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityHibernateMappingGenerator.java trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaGeneratorUtil.java trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaStereoTypes.java Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityHibernateMappingGenerator.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityHibernateMappingGenerator.java 2011-12-19 22:47:20 UTC (rev 2385) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/EntityHibernateMappingGenerator.java 2011-12-27 14:37:01 UTC (rev 2386) @@ -46,15 +46,11 @@ import org.apache.commons.lang3.StringUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.nuiton.eugene.GeneratorUtil; -import org.nuiton.eugene.java.JavaGenerator; -import org.nuiton.eugene.java.JavaGeneratorUtil; import org.nuiton.eugene.models.object.ObjectModelAssociationClass; import org.nuiton.eugene.models.object.ObjectModelAttribute; import org.nuiton.eugene.models.object.ObjectModelClass; import org.nuiton.eugene.models.object.ObjectModelGenerator; -import javax.persistence.EnumType; import java.io.File; import java.io.IOException; import java.io.Writer; @@ -201,10 +197,54 @@ /*{ </class> }*/ } + + generateDatabaseObjects(output, input, naturalAttributes); + generateDatabaseObjects(output, input, noneNaturalAttributes); + /*{</hibernate-mapping> }*/ } + protected void generateDatabaseObjects(Writer output, + ObjectModelClass clazz, + List<ObjectModelAttribute> attributes) throws IOException { + + for (ObjectModelAttribute attribute : attributes) { + if (!attribute.isNavigable() || + attribute.hasAssociationClass() || + !TopiaGeneratorUtil.hasTableAssocIndexStereotype(attribute) || + !TopiaGeneratorUtil.isNMultiplicity(attribute) || + attribute.getClassifier() == null || + !TopiaGeneratorUtil.isEntity(attribute.getClassifier()) + ) { + // skip for this case + + continue; + } + + // add database-object to create and drop index + + String tableName; + String indexName = "idx_" + clazz.getName() + "_" + attribute.getName(); + String propertyName; + + + if (TopiaGeneratorUtil.isNMultiplicity(attribute.getReverseMaxMultiplicity())) { + + // many to many + tableName = TopiaGeneratorUtil.getManyToManyTableName(attribute); + propertyName = TopiaGeneratorUtil.getDbName(attribute.getClassifier()); + } else { + + // one to many + tableName =TopiaGeneratorUtil.getDbName(attribute.getClassifier()); + propertyName = TopiaGeneratorUtil.getDbName(clazz); + } +/*{ <database-object><create>CREATE INDEX <%=indexName%> ON <%=tableName%>(<%=propertyName%>)</create><drop>DROP INDEX <%=indexName%></drop></database-object> +}*/ + + } + } protected void generateAttributes(Writer output, ObjectModelClass clazz, List<ObjectModelAttribute> attributes, @@ -218,9 +258,9 @@ if (attr.isNavigable() || hasUnidirectionalRelationOnAbstractType(reverse, model) || attr.hasAssociationClass()) { - if (!GeneratorUtil.isNMultiplicity(attr)) { + if (!TopiaGeneratorUtil.isNMultiplicity(attr)) { if (attr.getClassifier() != null && TopiaGeneratorUtil.isEntity(attr.getClassifier())) { - if (GeneratorUtil.isNMultiplicity(attr.getReverseMaxMultiplicity()) && !attr.hasAssociationClass()) { + if (TopiaGeneratorUtil.isNMultiplicity(attr.getReverseMaxMultiplicity()) && !attr.hasAssociationClass()) { generateHibernateManyToOne(output, attr, prefix); } else { generateHibernateOneToOne(output, attr, prefix); @@ -230,7 +270,7 @@ } } else { if (attr.getClassifier() != null && TopiaGeneratorUtil.isEntity(attr.getClassifier())) { - if (GeneratorUtil.isNMultiplicity(attr.getReverseMaxMultiplicity()) && !attr.hasAssociationClass()) { + if (TopiaGeneratorUtil.isNMultiplicity(attr.getReverseMaxMultiplicity()) && !attr.hasAssociationClass()) { generateHibernateManyToMany(output, attr, prefix); } else { generateHibernateOneToMany(output, attr, prefix); @@ -264,7 +304,7 @@ // } //Ne sert plus grâce à l'utilisation de la navigabilité // if (!attr.getReverseAttribute().isNavigable()) { -// String type = GeneratorUtil.getDOType(((ObjectModelClassifier)attr.getDeclaringElement()).getQualifiedName(), model); +// String type = TopiaGeneratorUtil.getDOType(((ObjectModelClassifier)attr.getDeclaringElement()).getQualifiedName(), model); // String name = Util.toLowerCaseFirstLetter(attr.getDeclaringElement().getName()); // if (log.isTraceEnabled()) {log.trace("reverse: " + type + " " + name);} // if (!Util.isNMultiplicity(attr)) { @@ -285,9 +325,9 @@ } protected String getName(ObjectModelAttribute attr, boolean isAssoc) { - String result = GeneratorUtil.toLowerCaseFirstLetter(attr.getName()); + String result = TopiaGeneratorUtil.toLowerCaseFirstLetter(attr.getName()); if (attr.hasAssociationClass() && !isAssoc) { - result = GeneratorUtil.getAssocAttrName(attr); + result = TopiaGeneratorUtil.getAssocAttrName(attr); } return result; } @@ -360,7 +400,7 @@ // optionalAttributes += "schema=\"" + schema + "\" "; } - if (JavaGeneratorUtil.hasIndexedStereotype(attr)) { + if (TopiaGeneratorUtil.hasIndexedStereotype(attr)) { String indexName = tableName + "_idx"; optionalAttributes += generateFromTagValue(HIBERNATE_ATTRIBUTE_INDEX, indexName); // optionalAttributes += "index=\"" + indexName + "\" "; @@ -374,7 +414,7 @@ }*/ } else { String optionalAttributes = ""; - if (JavaGeneratorUtil.hasIndexedStereotype(attr)) { + if (TopiaGeneratorUtil.hasIndexedStereotype(attr)) { String indexName = tableName + "_idx"; optionalAttributes += generateFromTagValue(HIBERNATE_ATTRIBUTE_INDEX, indexName); // optionalAttributes += "index=\"" + indexName + "\""; @@ -495,7 +535,7 @@ ObjectModelAttribute attr, String prefix) throws IOException { // boolean accessField = hasUnidirectionalRelationOnAbstractType(attr.getReverseAttribute(), model); -/// *{ <one-to-one name="<%=getName(attr)%>" class="<%=getType(attr)%>"<%=(TopiaGeneratorUtil.notEmpty(attr.getTagValue(GeneratorUtil.TAG_LENGTH))?(" length=\"" + attr.getTagValue(GeneratorUtil.TAG_LENGTH) + "\""):"")%><%=((attr.isComposite() || attr.hasAssociationClass())?" cascade=\"delete\"":"")%><%=((accessField)?" access=\"field\"":"")%> node="<%=getName(attr)%>/@topiaId" embed-xml="false"/> +/// *{ <one-to-one name="<%=getName(attr)%>" class="<%=getType(attr)%>"<%=(TopiaGeneratorUtil.notEmpty(attr.getTagValue(TopiaGeneratorUtil.TAG_LENGTH))?(" length=\"" + attr.getTagValue(TopiaGeneratorUtil.TAG_LENGTH) + "\""):"")%><%=((attr.isComposite() || attr.hasAssociationClass())?" cascade=\"delete\"":"")%><%=((accessField)?" access=\"field\"":"")%> node="<%=getName(attr)%>/@topiaId" embed-xml="false"/> //} */ // for hibernate many-to-one with unique="true" => one-to-one @@ -509,7 +549,7 @@ protected void generateHibernateOneToMany(Writer output, ObjectModelAttribute attr, String prefix) throws IOException { - boolean needsIndex = JavaGeneratorUtil.hasIndexedStereotype(attr); + boolean needsIndex = TopiaGeneratorUtil.hasIndexedStereotype(attr); boolean isInverse = attr.getReverseAttribute().isNavigable(); isInverse |= hasUnidirectionalRelationOnAbstractType(attr, model); @@ -584,7 +624,7 @@ protected void generateHibernateMany(Writer output, ObjectModelAttribute attr, String prefix) throws IOException { - boolean needsIndex = JavaGeneratorUtil.hasIndexedStereotype(attr); + boolean needsIndex = TopiaGeneratorUtil.hasIndexedStereotype(attr); String attrName = getName(attr); String attrType = getType(attr); String collType = TopiaGeneratorUtil.getNMultiplicityHibernateType(attr); @@ -661,10 +701,10 @@ // premier attribut dans l'ordre alphabétique sera choisi pour porter le // inverse="true" } else { - isInverse &= GeneratorUtil.isFirstAttribute(attr); + isInverse &= TopiaGeneratorUtil.isFirstAttribute(attr); } - boolean needsIndex = JavaGeneratorUtil.hasIndexedStereotype(attr); + boolean needsIndex = TopiaGeneratorUtil.hasIndexedStereotype(attr); String cascade = ""; if (attr.isComposite() || attr.hasAssociationClass()) { cascade = " cascade=\"delete,delete-orphan\""; Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaGeneratorUtil.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaGeneratorUtil.java 2011-12-19 22:47:20 UTC (rev 2385) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaGeneratorUtil.java 2011-12-27 14:37:01 UTC (rev 2386) @@ -1277,6 +1277,19 @@ } /** + * Check if the given attribute has the + * {@link TopiaStereoTypes#STEREOTYPE_TABLE_ASSOC_INDEX} stereotype. + * + * @param attribute attribute to test + * @return {@code true} if stereotype was found, {@code false otherwise} + * @see TopiaStereoTypes#STEREOTYPE_TABLE_ASSOC_INDEX + * @since 2.6.5 + */ + public static boolean hasTableAssocIndexStereotype(ObjectModelAttribute attribute) { + return attribute.hasStereotype(TopiaStereoTypes.STEREOTYPE_TABLE_ASSOC_INDEX); + } + + /** * Obtain the value of the {@link TopiaTagValues#TAG_PERSISTENCE_TYPE} * tag value on the given classifier. * <p/> Modified: trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaStereoTypes.java =================================================================== --- trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaStereoTypes.java 2011-12-19 22:47:20 UTC (rev 2385) +++ trunk/topia-persistence/src/main/java/org/nuiton/topia/generator/TopiaStereoTypes.java 2011-12-27 14:37:01 UTC (rev 2386) @@ -115,4 +115,14 @@ @StereotypeDefinition(target = ObjectModelAttribute.class, documentation = "To specify that an attribute is part of a primary key (Hibernate mapping)") String STEREOTYPE_PRIMARYKAY = "primaryKey"; + + /** + * Stéréotype pour les attributs avec multiplicité nécessitant la création d'un index. + * + * @see TopiaGeneratorUtil#hasTableAssocIndexStereotype(ObjectModelAttribute) + * @since 2.6.5 + */ + @StereotypeDefinition(target = ObjectModelAttribute.class, + documentation = "To specify that an association attribute needs an index in db (Hibernate mapping)") + String STEREOTYPE_TABLE_ASSOC_INDEX = "tableAssocIndex"; }
participants (1)
-
tchemit@users.nuiton.org