Re-wrote free text searching interfaces for Taxon and Description to make them more...
authorben.clark <ben.clark@localhost>
Fri, 15 May 2009 16:26:59 +0000 (16:26 +0000)
committerben.clark <ben.clark@localhost>
Fri, 15 May 2009 16:26:59 +0000 (16:26 +0000)
12 files changed:
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/AgentServiceImpl.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/DescriptionServiceImpl.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IAgentService.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IDescriptionService.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IMediaService.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/IReferenceService.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/ITaxonService.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/MediaServiceImpl.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/ReferenceServiceImpl.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/ServiceBase.java
cdmlib-services/src/main/java/eu/etaxonomy/cdm/api/service/TaxonServiceImpl.java
cdmlib-services/src/test/resources/dbscripts/001_cdm.ddl

index 6c7ce288c8104d96b2402e62764410e07a0325f5..fbdf1708025201c3ce1ab58cea0b21dab9d6bf45 100644 (file)
@@ -30,6 +30,7 @@ import eu.etaxonomy.cdm.model.agent.InstitutionalMembership;
 import eu.etaxonomy.cdm.model.agent.Person;\r
 import eu.etaxonomy.cdm.model.agent.Team;\r
 import eu.etaxonomy.cdm.persistence.dao.agent.IAgentDao;\r
+import eu.etaxonomy.cdm.persistence.query.OrderHint;\r
 \r
 \r
 \r
@@ -121,5 +122,14 @@ public class AgentServiceImpl extends IdentifiableServiceBase<AgentBase,IAgentDa
                return new DefaultPagerImpl<Address>(pageNumber, numberOfResults, pageSize, results);\r
        }\r
 \r
-       \r
+       public Pager<AgentBase> search(Class<? extends AgentBase> clazz, String queryString, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths) {\r
+        Integer numberOfResults = dao.count(clazz,queryString);\r
+               \r
+               List<AgentBase> results = new ArrayList<AgentBase>();\r
+               if(numberOfResults > 0) { // no point checking again\r
+                       results = dao.search(clazz,queryString, pageSize, pageNumber, orderHints, propertyPaths); \r
+               }\r
+               \r
+               return new DefaultPagerImpl<AgentBase>(pageNumber, numberOfResults, pageSize, results);\r
+       }\r
 }\r
index afd4fd9c116409db741f36c708967fd86c898330..c682d2652d5822dd1f135986a6c5e03067fda384 100644 (file)
@@ -36,7 +36,6 @@ import eu.etaxonomy.cdm.model.description.Scope;
 import eu.etaxonomy.cdm.model.description.StatisticalMeasurementValue;\r
 import eu.etaxonomy.cdm.model.description.TaxonDescription;\r
 import eu.etaxonomy.cdm.model.description.TaxonNameDescription;\r
-import eu.etaxonomy.cdm.model.description.TextData;\r
 import eu.etaxonomy.cdm.model.location.NamedArea;\r
 import eu.etaxonomy.cdm.model.media.Media;\r
 import eu.etaxonomy.cdm.model.name.TaxonNameBase;\r
@@ -295,15 +294,15 @@ public class DescriptionServiceImpl extends IdentifiableServiceBase<DescriptionB
                return new DefaultPagerImpl<TaxonDescription>(pageNumber, numberOfResults, pageSize, results);\r
        }\r
 \r
-       public Pager<TextData> searchTextData(String queryString, Integer pageSize,     Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths) {\r
-        Integer numberOfResults = descriptionElementDao.countTextData(queryString);\r
+       public Pager<DescriptionElementBase> search(Class<? extends DescriptionElementBase> clazz, String queryString, Integer pageSize,        Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths) {\r
+        Integer numberOfResults = descriptionElementDao.count(clazz,queryString);\r
                \r
-               List<TextData> results = new ArrayList<TextData>();\r
+               List<DescriptionElementBase> results = new ArrayList<DescriptionElementBase>();\r
                if(numberOfResults > 0) { // no point checking again\r
-                       results = descriptionElementDao.searchTextData(queryString, pageSize, pageNumber, orderHints, propertyPaths); \r
+                       results = descriptionElementDao.search(clazz, queryString, pageSize, pageNumber, orderHints, propertyPaths); \r
                }\r
                \r
-               return new DefaultPagerImpl<TextData>(pageNumber, numberOfResults, pageSize, results);\r
+               return new DefaultPagerImpl<DescriptionElementBase>(pageNumber, numberOfResults, pageSize, results);\r
        }\r
 \r
        public FeatureTree getFeatureTreeByUuid(UUID uuid) {\r
@@ -321,4 +320,15 @@ public class DescriptionServiceImpl extends IdentifiableServiceBase<DescriptionB
        public FeatureTree loadFeatureTree(UUID uuid, List<String> propertyPaths) {\r
                return featureTreeDao.load(uuid, propertyPaths);\r
        }\r
+       public DescriptionElementBase loadDescriptionElement(UUID uuid, List<String> propertyPaths) {\r
+               return descriptionElementDao.load(uuid, propertyPaths);\r
+       }\r
+\r
+       public UUID saveDescriptionElement(DescriptionElementBase descriptionElement) {\r
+               return descriptionElementDao.save(descriptionElement);\r
+       }\r
+       \r
+       public UUID deleteDescriptionElement(DescriptionElementBase descriptionElement) {\r
+               return descriptionElementDao.delete(descriptionElement);\r
+       }\r
 }\r
index 94c4f17d049e3811992e9ccaa4d254e544d5820e..e3da539228c3c4da6542adbeaeb808f85ab2cbb1 100644 (file)
@@ -22,6 +22,7 @@ import eu.etaxonomy.cdm.model.agent.Institution;
 import eu.etaxonomy.cdm.model.agent.InstitutionalMembership;\r
 import eu.etaxonomy.cdm.model.agent.Person;\r
 import eu.etaxonomy.cdm.model.agent.Team;\r
+import eu.etaxonomy.cdm.persistence.query.OrderHint;\r
 \r
 public interface IAgentService extends IIdentifiableEntityService<AgentBase> {\r
        \r
@@ -71,4 +72,21 @@ public interface IAgentService extends IIdentifiableEntityService<AgentBase> {
         * @return a Pager containing Address  instances\r
         */\r
        public Pager<Address> getAddresses(AgentBase agent, Integer pageSize, Integer pageNumber);\r
+       \r
+       /**\r
+        * Returns a Paged List of AgentBase instances where the default field matches the String queryString (as interpreted by the Lucene QueryParser)\r
+        * \r
+        * @param clazz filter the results by class (or pass null to return all AgentBase instances)\r
+        * @param queryString\r
+        * @param pageSize The maximum number of agents returned (can be null for all matching agents)\r
+        * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)\r
+        * @param orderHints\r
+        *            Supports path like <code>orderHints.propertyNames</code> which\r
+        *            include *-to-one properties like createdBy.username or\r
+        *            authorTeam.persistentTitleCache\r
+        * @param propertyPaths properties to be initialized\r
+        * @return a Pager Agent instances\r
+        * @see <a href="http://lucene.apache.org/java/2_4_0/queryparsersyntax.html">Apache Lucene - Query Parser Syntax</a>\r
+        */\r
+       public Pager<AgentBase> search(Class<? extends AgentBase> clazz, String queryString, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths);\r
 }\r
index d96b18c3848f1bdbda3a5d8b9b0f94cab450b6f2..35fe4c73c8f4b0fdfb17a9c321b2bbf8b664e1a6 100644 (file)
@@ -39,7 +39,6 @@ import eu.etaxonomy.cdm.persistence.query.OrderHint;
 public interface IDescriptionService extends IIdentifiableEntityService<DescriptionBase> {\r
 \r
        /**\r
-        * @param uuid\r
         * @return\r
         */\r
        // FIXME candidate for harmonization? findByUuid\r
@@ -119,6 +118,34 @@ public interface IDescriptionService extends IIdentifiableEntityService<Descript
         */\r
        public DescriptionElementBase getDescriptionElementByUuid(UUID uuid);\r
        \r
+       /**\r
+        * Loads and existing DescriptionElementBase instance matching the supplied uuid,\r
+        * and recursively initializes all bean properties given in the\r
+        * <code>propertyPaths</code> parameter.\r
+        * <p>\r
+        * For detailed description and examples <b>please refer to:</b> \r
+        * {@link BeanInitializer#initialize(Object, List)}\r
+        * \r
+        * @param uuid the uuid of the DescriptionElement of interest\r
+        * @return a DescriptionElement, or null if the DescriptionElement does not exist\r
+        */\r
+       public DescriptionElementBase loadDescriptionElement(UUID uuid,List<String> propertyPaths);\r
+       \r
+       /**\r
+        * Persists a <code>DescriptionElementBase</code>\r
+        * @param descriptionElement\r
+        * @return\r
+        */\r
+       public UUID saveDescriptionElement(DescriptionElementBase descriptionElement);\r
+       \r
+       /**\r
+        * Delete an existing description element\r
+        * \r
+        * @param descriptionElement the description element to be deleted\r
+        * @return the unique identifier of the deleted entity\r
+        */\r
+       public UUID deleteDescriptionElement(DescriptionElementBase descriptionElement);\r
+       \r
        /**\r
         * List the descriptions of type <TYPE>, filtered using the following parameters\r
         *  \r
@@ -197,17 +224,21 @@ public interface IDescriptionService extends IIdentifiableEntityService<Descript
        public Pager<TaxonDescription> searchDescriptionByDistribution(Set<NamedArea> namedAreas, PresenceAbsenceTermBase presence, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths);\r
        \r
        /**\r
-     * Returns a List of TextData elements that match a given queryString provided.\r
+        * Returns a Paged List of DescriptionElementBase instances where the default field matches the String queryString (as interpreted by the Lucene QueryParser)\r
         * \r
-        * @param queryString \r
-        * @param pageSize\r
-        * @param pageNumber\r
-        * @param orderHints may be null\r
-        * @param propertyPaths Properties to initialize in the returned entities, following the syntax described in {@link BeanInitializer#initialize(Object, List)}\r
-        * @return\r
-        * @throws QueryParseException\r
+        * @param clazz filter the results by class (or pass null to return all DescriptionElementBase instances)\r
+        * @param queryString\r
+        * @param pageSize The maximum number of descriptionElements returned (can be null for all matching descriptionElements)\r
+        * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)\r
+        * @param orderHints\r
+        *            Supports path like <code>orderHints.propertyNames</code> which\r
+        *            include *-to-one properties like createdBy.username or\r
+        *            authorTeam.persistentTitleCache\r
+        * @param propertyPaths properties to be initialized\r
+        * @return a Pager DescriptionElementBase instances\r
+        * @see <a href="http://lucene.apache.org/java/2_4_0/queryparsersyntax.html">Apache Lucene - Query Parser Syntax</a>\r
         */\r
-       public Pager<TextData> searchTextData(String queryString, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths);\r
+       public Pager<DescriptionElementBase> search(Class<? extends DescriptionElementBase> clazz, String queryString, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths);\r
        \r
        /**\r
      * Returns a List of Media that are associated with a given description element\r
index 0bf19ebe93f5303202b8c9ecb6c328dcc51fda46..10ed552a8150a3906fe5957c67e1f7e023e506b3 100644 (file)
@@ -25,6 +25,7 @@ import eu.etaxonomy.cdm.model.media.MediaRepresentationPart;
 import eu.etaxonomy.cdm.model.media.Rights;\r
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
 import eu.etaxonomy.cdm.persistence.dao.BeanInitializer;\r
+import eu.etaxonomy.cdm.persistence.query.OrderHint;\r
 \r
 public interface IMediaService extends IAnnotatableService<Media> {\r
 \r
@@ -60,4 +61,21 @@ public interface IMediaService extends IAnnotatableService<Media> {
         * @return a Pager of Rights entities\r
         */\r
     public Pager<Rights> getRights(Media t, Integer pageSize, Integer pageNumber, List<String> propertyPaths);\r
+    \r
+    /**\r
+        * Returns a Paged List of Media instances where the default field matches the String queryString (as interpreted by the Lucene QueryParser)\r
+        * \r
+        * @param clazz filter the results by class (or pass null to return all Media instances)\r
+        * @param queryString\r
+        * @param pageSize The maximum number of media returned (can be null for all matching media)\r
+        * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)\r
+        * @param orderHints\r
+        *            Supports path like <code>orderHints.propertyNames</code> which\r
+        *            include *-to-one properties like createdBy.username or\r
+        *            authorTeam.persistentTitleCache\r
+        * @param propertyPaths properties to be initialized\r
+        * @return a Pager Media instances\r
+        * @see <a href="http://lucene.apache.org/java/2_4_0/queryparsersyntax.html">Apache Lucene - Query Parser Syntax</a>\r
+        */\r
+       public Pager<Media> search(Class<? extends Media> clazz, String queryString, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths);\r
 }\r
index 355ab267cacb86a2b834c02671281aeb028494d5..953ed0a546207af42a726efd9210b187f913b80b 100644 (file)
@@ -12,8 +12,8 @@ package eu.etaxonomy.cdm.api.service;
 
 import java.util.Collection;
 import java.util.List;
-import java.util.UUID;
 import java.util.Map;
+import java.util.UUID;
 
 import eu.etaxonomy.cdm.api.service.pager.Pager;
 import eu.etaxonomy.cdm.model.reference.ReferenceBase;
@@ -82,4 +82,21 @@ public interface IReferenceService extends IIdentifiableEntityService<ReferenceB
         */
        public abstract Map<UUID, ReferenceBase> saveReferenceAll(Collection<ReferenceBase> referenceCollection);
        
+       /**
+        * Returns a Paged List of ReferenceBase instances where the default field matches the String queryString (as interpreted by the Lucene QueryParser)
+        * 
+        * @param clazz filter the results by class (or pass null to return all ReferenceBase instances)
+        * @param queryString
+        * @param pageSize The maximum number of references returned (can be null for all matching references)
+        * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)
+        * @param orderHints
+        *            Supports path like <code>orderHints.propertyNames</code> which
+        *            include *-to-one properties like createdBy.username or
+        *            authorTeam.persistentTitleCache
+        * @param propertyPaths properties to be initialized
+        * @return a Pager ReferenceBase instances
+        * @see <a href="http://lucene.apache.org/java/2_4_0/queryparsersyntax.html">Apache Lucene - Query Parser Syntax</a>
+        */
+       public Pager<ReferenceBase> search(Class<? extends ReferenceBase> clazz, String queryString, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths);
+       
 }
index 10794002bb2562d140a7e7786e4e8b1395f1943d..98ff999ff2ab9809dc6b4993eeace49ac804d1f6 100644 (file)
@@ -192,17 +192,21 @@ public interface ITaxonService extends IIdentifiableEntityService<TaxonBase>{
        public List<List<Synonym>> getHeterotypicSynonymyGroups(Taxon taxon, List<String> propertyPaths);
        
        /**
-        * Returns a List of TaxonBase instances (or Taxon instances, if accepted == true, or Synonym instance, if accepted == false) where the 
-        * taxonBase.name.nameCache property matches the String queryString (as interpreted by the Lucene QueryParser)
+        * Returns a Paged List of TaxonBase instances where the default field matches the String queryString (as interpreted by the Lucene QueryParser)
         * 
+        * @param clazz filter the results by class (or pass null to return all TaxonBase instances)
         * @param queryString
-        * @param accepted
         * @param pageSize The maximum number of taxa returned (can be null for all matching taxa)
         * @param pageNumber The offset (in pageSize chunks) from the start of the result set (0 - based)
+        * @param orderHints
+        *            Supports path like <code>orderHints.propertyNames</code> which
+        *            include *-to-one properties like createdBy.username or
+        *            authorTeam.persistentTitleCache
+        * @param propertyPaths properties to be initialized
         * @return a Pager Taxon instances
         * @see <a href="http://lucene.apache.org/java/2_4_0/queryparsersyntax.html">Apache Lucene - Query Parser Syntax</a>
         */
-       public Pager<TaxonBase> searchTaxa(String queryString, Boolean accepted, Integer pageSize, Integer pageNumber);
+       public Pager<TaxonBase> search(Class<? extends TaxonBase> clazz, String queryString, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths);
        
        /**
         * Returns a list of TaxonBase instances (or Taxon instances, if accepted == true, or Synonym instance, if accepted == false) where the
index f5edae0fa977b1054b3d2b8cca3b617fd181d22b..201a868cd415bf50dd778379041659495bac708a 100644 (file)
@@ -33,6 +33,7 @@ import eu.etaxonomy.cdm.model.taxon.Taxon;
 import eu.etaxonomy.cdm.persistence.dao.media.IMediaDao;\r
 import eu.etaxonomy.cdm.persistence.dao.media.IMediaRepresentationDao;\r
 import eu.etaxonomy.cdm.persistence.dao.media.IMediaRepresentationPartDao;\r
+import eu.etaxonomy.cdm.persistence.query.OrderHint;\r
 \r
 @Service\r
 @Transactional\r
@@ -89,4 +90,15 @@ public class MediaServiceImpl extends AnnotatableServiceBase<Media,IMediaDao> im
                \r
                return new DefaultPagerImpl<Rights>(pageNumber, numberOfResults, pageSize, results);\r
        }\r
+       \r
+       public Pager<Media> search(Class<? extends Media> clazz, String queryString, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths) {\r
+        Integer numberOfResults = dao.count(clazz,queryString);\r
+               \r
+               List<Media> results = new ArrayList<Media>();\r
+               if(numberOfResults > 0) { // no point checking again\r
+                       results = dao.search(clazz,queryString, pageSize, pageNumber, orderHints, propertyPaths); \r
+               }\r
+               \r
+               return new DefaultPagerImpl<Media>(pageNumber, numberOfResults, pageSize, results);\r
+       }\r
 }\r
index 0db2f8e3d84ff4dcbd57ad10e8dc6f67596f1c3b..41ee91f8c8a80b7268d08919c53b4efa1e949bd3 100644 (file)
@@ -27,6 +27,7 @@ import eu.etaxonomy.cdm.model.name.BotanicalName;
 import eu.etaxonomy.cdm.model.name.HybridRelationship;\r
 import eu.etaxonomy.cdm.model.name.HybridRelationshipType;\r
 import eu.etaxonomy.cdm.model.reference.ReferenceBase;\r
+import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
 import eu.etaxonomy.cdm.persistence.dao.reference.IReferenceDao;\r
 import eu.etaxonomy.cdm.persistence.query.OrderHint;\r
 \r
@@ -102,7 +103,15 @@ public class ReferenceServiceImpl extends IdentifiableServiceBase<ReferenceBase,
        protected void setDao(IReferenceDao dao) {\r
                this.dao = dao;\r
        }\r
-\r
-\r
-\r
+       \r
+       public Pager<ReferenceBase> search(Class<? extends ReferenceBase> clazz, String queryString, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths) {\r
+        Integer numberOfResults = dao.count(clazz,queryString);\r
+               \r
+               List<ReferenceBase> results = new ArrayList<ReferenceBase>();\r
+               if(numberOfResults > 0) { // no point checking again\r
+                       results = dao.search(clazz,queryString, pageSize, pageNumber, orderHints, propertyPaths); \r
+               }\r
+               \r
+               return new DefaultPagerImpl<ReferenceBase>(pageNumber, numberOfResults, pageSize, results);\r
+       }\r
 }\r
index 40be9ad80cd1876a7fc4b1514f4502578bd1deff..161b7ce2410a5b641150771da443f7916ab92c1f 100644 (file)
@@ -28,8 +28,6 @@ import org.springframework.transaction.annotation.Transactional;
 import eu.etaxonomy.cdm.api.service.pager.Pager;\r
 import eu.etaxonomy.cdm.api.service.pager.impl.DefaultPagerImpl;\r
 import eu.etaxonomy.cdm.model.common.CdmBase;\r
-import eu.etaxonomy.cdm.model.reference.ReferenceBase;\r
-import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
 import eu.etaxonomy.cdm.persistence.dao.common.ICdmEntityDao;\r
 import eu.etaxonomy.cdm.persistence.query.OrderHint;\r
 \r
index 7fb38a889c351b527162a372d39b71bc375d84a3..47078d1609ca48cb6c9d75fd8881faf661d99d30 100644 (file)
@@ -328,12 +328,12 @@ public class TaxonServiceImpl extends IdentifiableServiceBase<TaxonBase,ITaxonDa
                return heterotypicSynonymyGroups;\r
        }\r
 \r
-       public Pager<TaxonBase> searchTaxa(String queryString, Boolean accepted, Integer pageSize, Integer pageNumber) {\r
-        Integer numberOfResults = dao.countTaxa(queryString, accepted);\r
+       public Pager<TaxonBase> search(Class<? extends TaxonBase> clazz, String queryString, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths) {\r
+        Integer numberOfResults = dao.count(clazz,queryString);\r
                \r
                List<TaxonBase> results = new ArrayList<TaxonBase>();\r
                if(numberOfResults > 0) { // no point checking again\r
-                       results = dao.searchTaxa(queryString, accepted, pageSize, pageNumber); \r
+                       results = dao.search(clazz,queryString, pageSize, pageNumber, orderHints, propertyPaths); \r
                }\r
                \r
                return new DefaultPagerImpl<TaxonBase>(pageNumber, numberOfResults, pageSize, results);\r
index b50e81c4b4d4e01990a2dd2b2e0466dc53440bae..5b2f5b4cca7903ca664e83a3cee7b1c6fd211b61 100644 (file)
         titleCache varchar(255),
         createdby_id integer,
         updatedby_id integer,
+        code varchar(255),
+        name varchar(255),
+        ispartof_id integer,
         nomenclaturaltitle varchar(255),
+        protectednomenclaturaltitlecache bit,
         firstname varchar(255),
         lastname varchar(255),
         lifespan_end varchar(255),
         lifespan_start varchar(255),
         prefix varchar(255),
         suffix varchar(255),
-        protectednomenclaturaltitlecache bit,
-        code varchar(255),
-        name varchar(255),
-        ispartof_id integer,
         primary key (id, REV)
     );
 
 
     create table AuditEvent (
         revisionnumber integer generated by default as identity (start with 1),
+        date timestamp,
         timestamp bigint,
         uuid varchar(255),
         primary key (revisionnumber)
         kindof_id integer,
         partof_id integer,
         vocabulary_id integer,
+        orderindex integer,
         iso639_1 varchar(2),
         iso639_2 varchar(3),
-        orderindex integer,
-        symmetric bit,
-        transitive bit,
         supportscategoricaldata bit,
         supportscommontaxonname bit,
         supportsdistribution bit,
         supportsquantitativedata bit,
         supportstaxoninteraction bit,
         supportstextdata bit,
+        defaultcolor varchar(255),
         pointapproximation_errorradius integer,
         pointapproximation_latitude double,
         pointapproximation_longitude double,
         shape_id integer,
         type_id integer,
         iso3166_a2 varchar(2),
-        defaultcolor varchar(255),
+        symmetric bit,
+        transitive bit,
         primary key (id, REV)
     );
 
         imagegallery bit,
         createdby_id integer,
         updatedby_id integer,
-        taxonName_fk integer,
         taxon_fk integer,
+        taxonName_fk integer,
         primary key (id, REV)
     );
 
         citation_id integer,
         feature_id integer,
         indescription_id integer,
+        nameusedinreference_id integer,
         language_id integer,
         area_id integer,
         status_id integer,
         unit_id integer,
         taxon2_id integer,
         format_id integer,
-        nameusedinreference_id integer,
-               primary key (id)
+        primary key (id)
     );
 
     create table DescriptionElementBase_AUD (
         citation_id integer,
         feature_id integer,
         indescription_id integer,
+        nameusedinreference_id integer,
         format_id integer,
-        unit_id integer,
-        orderrelevant bit,
-        area_id integer,
-        status_id integer,
         taxon2_id integer,
+        unit_id integer,
         associatedspecimenorobservation_id integer,
+        orderrelevant bit,
         name varchar(255),
         language_id integer,
-        nameusedinreference_id integer,
-               primary key (id, REV)
+        area_id integer,
+        status_id integer,
+        primary key (id, REV)
     );
 
     create table DescriptionElementBase_Annotation (
         createdby_id integer,
         updatedby_id integer,
         representation_id integer,
+        duration integer,
         height integer,
         width integer,
-        duration integer,
         primary key (id, REV)
     );
 
         createdby_id integer,
         updatedby_id integer,
         authorteam_id integer,
-        datepublished_end varchar(255),
-        datepublished_start varchar(255),
-        title longvarchar,
-        issn varchar(255),
-        editor varchar(255),
-        pages varchar(255),
-        series varchar(255),
-        volume varchar(255),
-        inbook_id integer,
-        injournal_id integer,
-        school_id integer,
-        inproceedings_id integer,
-        seriespart varchar(255),
-        inseries_id integer,
-        organization varchar(255),
-        edition varchar(255),
-        isbn varchar(255),
-        institution_id integer,
         address varchar(255),
         annote varchar(255),
         booktitle varchar(255),
         chapter varchar(255),
+        edition varchar(255),
+        editor varchar(255),
         eprint varchar(255),
         howpublished varchar(255),
         institution varchar(255),
         month varchar(255),
         note varchar(255),
         number varchar(255),
+        organization varchar(255),
+        pages varchar(255),
         publisher varchar(255),
         reporttype varchar(255),
         school varchar(255),
+        series varchar(255),
+        title varchar(255),
+        volume varchar(255),
         year varchar(255),
         crossref_id integer,
         type_id integer,
+        datepublished_end varchar(255),
+        datepublished_start varchar(255),
+        injournal_id integer,
+        school_id integer,
+        issn varchar(255),
+        institution_id integer,
+        inbook_id integer,
+        inproceedings_id integer,
+        seriespart varchar(255),
+        inseries_id integer,
+        isbn varchar(255),
         primary key (id, REV)
     );
 
         updatedby_id integer,
         lifestage_id integer,
         sex_id integer,
+        fieldnotes varchar(255),
+        fieldnumber varchar(255),
+        gatheringevent_id integer,
         accessionnumber varchar(255),
         catalognumber varchar(255),
         collectorsnumber varchar(255),
         collection_id integer,
         derivationevent_id integer,
         storedunder_id integer,
-        fieldnotes varchar(255),
-        fieldnumber varchar(255),
-        gatheringevent_id integer,
         preservation_id integer,
         primary key (id, REV)
     );
         combinationauthorteam_id integer,
         exbasionymauthorteam_id integer,
         excombinationauthorteam_id integer,
+        acronym varchar(255),
+        nameapprobation varchar(255),
+        subgenusauthorship varchar(255),
         breed varchar(255),
         originalpublicationyear integer,
         publicationyear integer,
         hybridformula bit,
         monomhybrid bit,
         trinomhybrid bit,
-        nameapprobation varchar(255),
-        subgenusauthorship varchar(255),
-        acronym varchar(255),
         cultivarname varchar(255),
         primary key (id, REV)
     );
         foreign key (associatedspecimenorobservation_id) 
         references SpecimenOrObservationBase;
 
+    alter table DescriptionElementBase 
+        add constraint FK38FE76714220AFEB 
+        foreign key (feature_id) 
+        references DefinedTermBase;
+
+    alter table DescriptionElementBase 
+        add constraint FK38FE7671BC5DA539 
+        foreign key (updatedby_id) 
+        references UserAccount;
+
+    alter table DescriptionElementBase 
+        add constraint FK38FE76719108D9B 
+        foreign key (taxon2_id) 
+        references TaxonBase;
+
     alter table DescriptionElementBase 
         add constraint FK38FE76714FF2DB2C 
         foreign key (createdby_id) 
         references UserAccount;
 
     alter table DescriptionElementBase 
-        add constraint FK38FE767110A80E07 
-        foreign key (unit_id) 
-        references DefinedTermBase;
+        add constraint FK38FE7671A308E33C 
+        foreign key (nameusedinreference_id) 
+        references TaxonNameBase;
 
     alter table DescriptionElementBase 
-        add constraint FK38FE76716D0D7A56 
-        foreign key (format_id) 
+        add constraint FK38FE767110A80E07 
+        foreign key (unit_id) 
         references DefinedTermBase;
 
     alter table DescriptionElementBase 
         references DefinedTermBase;
 
     alter table DescriptionElementBase 
-        add constraint FK38FE76714220AFEB 
-        foreign key (feature_id) 
+        add constraint FK38FE76716D0D7A56 
+        foreign key (format_id) 
         references DefinedTermBase;
 
     alter table DescriptionElementBase 
         references ReferenceBase;
 
     alter table DescriptionElementBase 
-        add constraint FK38FE7671BC5DA539 
-        foreign key (updatedby_id) 
-        references UserAccount;
-
-    alter table DescriptionElementBase 
-        add constraint FK38FE76719108D9B 
-        foreign key (taxon2_id) 
-        references TaxonBase;
+        add constraint FK38FE7671E8D36B00 
+        foreign key (language_id) 
+        references DefinedTermBase;
 
     alter table DescriptionElementBase 
         add constraint FK38FE76711C3C3FF7 
         foreign key (area_id) 
         references DefinedTermBase;
 
-    alter table DescriptionElementBase 
-        add constraint FK38FE7671E8D36B00 
-        foreign key (language_id) 
-        references DefinedTermBase;
-
     alter table DescriptionElementBase_AUD 
         add constraint FKF3803C234869AAE 
         foreign key (REV)