diff --git a/artemis_sqlmap/Feature.xml b/artemis_sqlmap/Feature.xml index b07917e695d2b01e2746cc64facc6f3a87985d71..e30fdf10413cc4cb06e8f7883f37ecfa2036dff7 100644 --- a/artemis_sqlmap/Feature.xml +++ b/artemis_sqlmap/Feature.xml @@ -25,7 +25,9 @@ <parameter property="featureCvTerms" javaType="java.util.List"/> </parameterMap> - <resultMap id="map-basicfeature" class="Feature"> + <!-- resultMap templates below --> + + <resultMap id="template-basicfeature" class="Feature"> <result property="timeLastModified" column="timelastmodified"/> <result property="featureId" column="id"/> <result property="uniqueName" column="uniquename"/> @@ -33,9 +35,30 @@ <result property="seqLen" column="seqlen" nullValue="-1" /> <result property="obsolete" column="obsolete" /> </resultMap> - - <resultMap id="map-feature" class="Feature" - groupBy="featureId" extends="map-basicfeature"> + + <resultMap id="template-basicfeature-all-lazy" class="Feature" + extends="template-basicfeature"> + <result property="cvTerm" column="type_id" select="getCvtermByCvTermId" /> + <result property="dbXRef" column="dbXRefId" + select="getDbXRefByDbXRefId" /> + <result property="featureLocsForFeatureId" column="{id=id}" + select="getFeatureLoc" /> + <result property="featureProps" column="{feature_id=id}" + select="getFeaturePropByFeatureId" /> + <result property="featureDbXRefs" column="{featureId=id}" + select="getFeatureDbXRef" /> + <result property="featureRelationshipsForObjectId" column="{object_id=id}" + select="getFeatureRelationship" /> + <result property="featureRelationshipsForSubjectId" column="{subject_id=id}" + select="getFeatureRelationship" /> + <result property="featureSynonyms" column="{feature.uniqueName=uniqueName}" + select="getLazyFeatureSynonymsByUniquename" /> + <result property="organism" column="{organismId=organismId}" + select="getOrganism" /> + </resultMap> + + <resultMap id="template-feature" class="Feature" + extends="template-basicfeature"> <result property="organism.organismId" column="organism_id"/> <result property="dbXRef" resultMap="DbXRef.select-dbxref" /> <result property="featureProps" resultMap="FeatureProp.map-featureprop" /> @@ -51,42 +74,44 @@ select="getLazyFeatureSynonymsByUniquename" /> <result property="featureDbXRefs" column="{featureId=id}" select="getFeatureDbXRef" /> - <result property="featureCvTerms" column="{{uniqueName=uniquename}}" - select="getFeatureCvTermsByFeature"/> <result property="featurePubs" column="{featureId=id}" select="getFeaturePubsByFeature"/> </resultMap> + + <!-- resultMap proper below --> + + <resultMap id="map-feature" class="Feature" + groupBy="featureId" extends="template-feature"> + <result property="featureCvTerms" column="{{uniqueName=uniquename}}" + select="getFeatureCvTermsByFeature"/> + </resultMap> + + <resultMap id="map-feature-no-rank" class="Feature" + groupBy="featureId" extends="template-feature"> + <result property="featureCvTerms" column="{{uniqueName=uniquename}}" + select="getFeatureCvTermsNoRankByFeature"/> + </resultMap> + - <!-- mapping for feature table and lazy loading of feature_dbxref, feature_relationship, - featureprop, organism tables --> - - <resultMap id="map-feature-lazy-no-residues" class="Feature" - extends="map-basicfeature"> - <result property="cvTerm" column="type_id" select="getCvtermByCvTermId" /> - <result property="dbXRef" column="dbXRefId" - select="getDbXRefByDbXRefId" /> - <result property="featureLocsForFeatureId" column="{id=id}" - select="getFeatureLoc" /> - <result property="featureProps" column="{feature_id=id}" - select="getFeaturePropByFeatureId" /> - <result property="featureDbXRefs" column="{featureId=id}" - select="getFeatureDbXRef" /> - <result property="featureRelationshipsForObjectId" column="{object_id=id}" - select="getFeatureRelationship" /> - <result property="featureRelationshipsForSubjectId" column="{subject_id=id}" - select="getFeatureRelationship" /> - <result property="featureSynonyms" column="{feature.uniqueName=uniqueName}" - select="getLazyFeatureSynonymsByUniquename" /> + <!-- mapping for feature table and lazy loading --> + <resultMap id="map-feature-lazy-no-residues" class="Feature" + extends="template-basicfeature-all-lazy"> <result property="featureCvTerms" column="{{uniqueName=uniquename}}" select="getFeatureCvTermsByFeature"/> - <result property="organism" column="{organismId=organismId}" - select="getOrganism" /> </resultMap> <resultMap id="map-feature-lazy" class="Feature" - extends="map-feature-lazy-no-residues"> + extends="template-basicfeature-all-lazy"> + <result property="featureCvTerms" column="{{uniqueName=uniquename}}" + select="getFeatureCvTermsByFeature"/> + <result property="residues" column="residues" /> + </resultMap> + + <resultMap id="map-feature-lazy-no-rank" class="Feature" + extends="template-basicfeature-all-lazy"> + <result property="featureCvTerms" column="{{uniqueName=uniquename}}" + select="getFeatureCvTermsNoRankByFeature"/> <result property="residues" column="residues" /> </resultMap> - <resultMap id="map-feature-name-lazy" class="Feature"> <result property="featureId" column="id"/> @@ -94,11 +119,10 @@ <result property="cvTerm.name" column="name" /> <result property="featureRelationshipsForSubjectId" column="{subject_id=id}" select="getParentFeatureRelationship" /> - </resultMap> - + </resultMap> <resultMap id="map-feature-withprop" class="Feature" - groupBy="featureId" extends="map-basicfeature"> + groupBy="featureId" extends="template-basicfeature"> <result property="cvTerm" column="type_id" select="getCvtermByCvTermId" /> <result property="featureProps" resultMap="FeatureProp.map-featureprop" /> <result property="featureDbXRefs" column="{featureId=id}" @@ -117,7 +141,7 @@ <resultMap id="map-similaritymatch-lazy" class="Feature" - groupBy="featureId" extends="map-basicfeature"> + groupBy="featureId" extends="template-basicfeature"> <result property="cvTerm.cvTermId" column="type_id" /> <result property="featureLocsForFeatureId" column="{id=id}" select="getFeatureLoc" /> @@ -157,10 +181,8 @@ <!-- SQL --> <!-- get feature --> - - <select id="getFeature" parameterClass="Feature" - resultMap="map-feature"> - SELECT + <sql id="sql-feature"> + SELECT timelastmodified, f.feature_id AS id, f.organism_id, @@ -202,11 +224,20 @@ uniquename LIKE #uniqueName# </isNotNull> </dynamic> + </sql> + + <select id="getFeature" parameterClass="Feature" + resultMap="map-feature"> + <include refid="sql-feature"/> + </select> + + <select id="getFeatureNoFeatureCvTermRank" parameterClass="Feature" + resultMap="map-feature-no-rank"> + <include refid="sql-feature"/> </select> - <select id="getLazyFeature" resultMap ="map-feature-lazy" - parameterClass="Feature"> - SELECT + <sql id="sql-lazy-feature"> + SELECT timelastmodified, f.feature_id AS id, uniquename, @@ -246,6 +277,17 @@ cvterm.name=#cvTerm.name# </isNotNull> </dynamic> + </sql> + + <select id="getLazyFeature" resultMap ="map-feature-lazy" + parameterClass="Feature"> + <include refid="sql-lazy-feature"/> + </select> + + <select id="getLazyFeatureNoFeatureCvTermRank" + resultMap ="map-feature-lazy-no-rank" + parameterClass="Feature"> + <include refid="sql-lazy-feature"/> </select> @@ -264,52 +306,6 @@ FROM feature f WHERE f.feature_id=$featureId$ </select> - - <select id="getLazyFeatureById" resultMap ="map-feature-lazy" > - SELECT - timelastmodified, - f.feature_id AS id, - uniquename, - organism_id AS organismId, - f.is_obsolete AS obsolete, - f.name AS feature_name, - f.type_id, - f.dbxref_id AS dbXRefId, - f.seqlen, - residues - FROM feature f - WHERE f.feature_id=$featureId$ - </select> - - <select id="getLazyFeatureNameAndTypeById" resultMap ="map-feature-name-lazy" > - SELECT - uniquename, cvTerm.name, feature_id AS id - FROM feature f - LEFT JOIN cvterm ON cvterm.cvterm_id=type_id - WHERE f.feature_id=$featureId$ - </select> - - - <select id="getFeatureById" resultMap ="map-feature-withprop" - cacheModel="feature-cache"> - SELECT - timelastmodified, - f.feature_id AS id, - uniquename, - organism_id AS organismId, - f.is_obsolete AS obsolete, - f.name AS feature_name, - f.type_id, - f.dbxref_id, - f.seqlen, - fp.type_id AS prop_type_id, fp.rank AS prop_rank, fp.value, fp.featureprop_id, - dbxref.*, db.* - FROM feature f - LEFT JOIN featureprop fp ON fp.feature_id=f.feature_id - LEFT JOIN dbxref ON f.dbxref_id=dbxref.dbxref_id - LEFT JOIN db ON dbxref.db_id=db.db_id - WHERE f.feature_id=$featureId$ - </select> <select id="getFeaturesByListOfIds" resultMap ="map-feature-withprop"> SELECT @@ -407,36 +403,6 @@ </select> - <!-- - <select id="getResidueFeatures" parameterClass="java.lang.Integer" - resultMap="map-feature-with-residues-result"> - SELECT feature.name, uniquename, feature_id, type_id, - feature.organism_id, abbreviation, genus, species, common_name, - cvterm.name AS cvterm_name - FROM feature - LEFT JOIN organism ON organism.organism_id=feature.organism_id - LEFT JOIN cvterm ON cvterm.cvterm_id=feature.type_id - WHERE <isNotNull> feature.organism_id=$value$ AND </isNotNull> - cvterm.name!='mRNA' AND cvterm.name!='pseudogenic_transcript' AND - cvterm.name!='polypeptide' AND - residues notnull AND residues NOT LIKE '' ORDER BY common_name - </select> - - <select id="getResidueFeaturesByOrganismCommonName" parameterClass="java.lang.String" - resultMap="map-feature-with-residues-result"> - SELECT feature.name, uniquename, feature_id, type_id, - feature.organism_id, abbreviation, genus, species, common_name, - cvterm.name AS cvterm_name - FROM feature - LEFT JOIN organism ON organism.organism_id=feature.organism_id - LEFT JOIN cvterm ON cvterm.cvterm_id=feature.type_id - WHERE <isNotNull> organism.common_name=#value# AND </isNotNull> - cvterm.name!='mRNA' AND cvterm.name!='pseudogenic_transcript' AND - cvterm.name!='polypeptide' AND - residues notnull AND residues NOT LIKE '' ORDER BY common_name - </select> - --> - <sql id="source_feature_cvterm_names"> cvterm.name LIKE '%chromosome%' OR cvterm.name LIKE '%sequence%' OR cvterm.name IN ('supercontig', 'ultra_scaffold', 'golden_path_region', 'contig') diff --git a/artemis_sqlmap/FeatureCvTerm.xml b/artemis_sqlmap/FeatureCvTerm.xml index 3abdec1dfc49df8dfcab35c290950a6e11e3a5bb..6ef8cd98e14b5e55f38f4bc3f6ad849d2a4d46b1 100644 --- a/artemis_sqlmap/FeatureCvTerm.xml +++ b/artemis_sqlmap/FeatureCvTerm.xml @@ -5,16 +5,14 @@ <sqlMap namespace="FeatureCvTerm"> - <cacheModel id="featurecvterm-rank-cache" type ="LRU" readOnly="true"> + <cacheModel id="featurecvterm-rank-cache" type ="LRU" readOnly="true"> <flushInterval hours="24"/> <property name="cache-size" value="15" /> </cacheModel> <typeAlias alias="FeatureCvTerm" type="org.gmod.schema.sequence.FeatureCvTerm"/> - - <resultMap id="select-featurecvterm-no-rank" class="FeatureCvTerm" groupBy="featureCvTermId"> <result property="featureCvTermId" column="feature_cvterm_id" /> @@ -41,10 +39,8 @@ <!-- select feature_cvterm --> - - <select id="getFeatureCvTermsBySrcFeature" parameterClass="org.gmod.schema.sequence.Feature" - resultMap="select-featurecvterm"> - SELECT + <sql id="sql_select_feature_cvterm"> + SELECT fc.*, fcp.type_id, fcp.value, fcp.rank AS fcp_rank, cvterm.name AS cvterm_name, @@ -60,6 +56,11 @@ LEFT JOIN pub ON fc.pub_id=pub.pub_id LEFT JOIN dbxref ON cvterm.dbxref_id=dbxref.dbxref_id LEFT JOIN db ON dbxref.db_id=db.db_id + </sql> + + <select id="getFeatureCvTermsBySrcFeature" parameterClass="org.gmod.schema.sequence.Feature" + resultMap="select-featurecvterm"> + <include refid="sql_select_feature_cvterm"/> WHERE feature_id IN (SELECT feature_id FROM featureloc fl WHERE srcfeature_id=$featureId$ <isGreaterThan property="featureLoc.fmin" compareValue="0" prepend="AND"> @@ -71,22 +72,7 @@ <select id="getFeatureCvTermsNoRankBySrcFeature" parameterClass="org.gmod.schema.sequence.Feature" resultMap="select-featurecvterm-no-rank"> - SELECT - fc.*, - fcp.type_id, fcp.value, fcp.rank AS fcp_rank, - cvterm.name AS cvterm_name, - cv.name AS cv_name, - pub.pub_id, - pub.uniquename, - db.name, - dbxref.accession - FROM feature_cvterm fc - LEFT JOIN feature_cvtermprop fcp ON fc.feature_cvterm_id=fcp.feature_cvterm_id - LEFT JOIN cvterm ON cvterm.cvterm_id=fc.cvterm_id - LEFT JOIN cv ON cvterm.cv_id=cv.cv_id - LEFT JOIN pub ON fc.pub_id=pub.pub_id - LEFT JOIN dbxref ON cvterm.dbxref_id=dbxref.dbxref_id - LEFT JOIN db ON dbxref.db_id=db.db_id + <include refid="sql_select_feature_cvterm"/> WHERE feature_id IN (SELECT feature_id FROM featureloc fl WHERE srcfeature_id=$featureId$ <isGreaterThan property="featureLoc.fmin" compareValue="0" prepend="AND"> @@ -98,22 +84,7 @@ <select id="getFeatureCvTermsByFeature" parameterClass="Feature" resultMap="select-featurecvterm"> - SELECT - fc.*, - fcp.type_id, fcp.value, fcp.rank AS fcp_rank, - cvterm.name AS cvterm_name, - cv.name AS cv_name, - pub.pub_id, - pub.uniquename, - db.name, - dbxref.accession - FROM feature_cvterm fc - LEFT JOIN feature_cvtermprop fcp ON fc.feature_cvterm_id=fcp.feature_cvterm_id - LEFT JOIN cvterm ON cvterm.cvterm_id=fc.cvterm_id - LEFT JOIN cv ON cvterm.cv_id=cv.cv_id - LEFT JOIN pub ON fc.pub_id=pub.pub_id - LEFT JOIN dbxref ON cvterm.dbxref_id=dbxref.dbxref_id - LEFT JOIN db ON dbxref.db_id=db.db_id + <include refid="sql_select_feature_cvterm"/> <dynamic> <isNotNull property="uniqueName" prepend="WHERE"> feature_id IN (SELECT feature_id FROM feature WHERE uniquename=#uniqueName#) @@ -121,30 +92,12 @@ </dynamic> ORDER BY fc.feature_cvterm_id, fc.rank, type_id, fcp.rank; </select> - - + + <!-- same as getFeatureCvTermsByFeature but without feature_cvterm.rank --> <select id="getFeatureCvTermsNoRankByFeature" parameterClass="Feature" resultMap="select-featurecvterm-no-rank"> - SELECT - fc.feature_id, - fc.feature_cvterm_id, - fc.cvterm_id, - fc.is_not, - fcp.type_id, fcp.value, fcp.rank AS fcp_rank, - cvterm.name AS cvterm_name, - cv.name AS cv_name, - pub.pub_id, - pub.uniquename, - db.name, - dbxref.accession - FROM feature_cvterm fc - LEFT JOIN feature_cvtermprop fcp ON fc.feature_cvterm_id=fcp.feature_cvterm_id - LEFT JOIN cvterm ON cvterm.cvterm_id=fc.cvterm_id - LEFT JOIN cv ON cvterm.cv_id=cv.cv_id - LEFT JOIN pub ON fc.pub_id=pub.pub_id - LEFT JOIN dbxref ON cvterm.dbxref_id=dbxref.dbxref_id - LEFT JOIN db ON dbxref.db_id=db.db_id + <include refid="sql_select_feature_cvterm"/> <dynamic> <isNotNull property="uniqueName" prepend="WHERE"> feature_id=(SELECT feature_id FROM feature WHERE uniquename=#uniqueName#) @@ -154,7 +107,6 @@ </select> - <select id="getFeatureCvTermColumnsForASchema" parameterClass="java.lang.String" resultClass="java.lang.String" cacheModel="featurecvterm-rank-cache"> SELECT pg_attribute.attname diff --git a/uk/ac/sanger/artemis/chado/IBatisDAO.java b/uk/ac/sanger/artemis/chado/IBatisDAO.java index 83dabe75396d3809e43941182a3dbbb2f4ecd7f7..47ac96692a522a06b1200cde18d8a3851f979e06 100644 --- a/uk/ac/sanger/artemis/chado/IBatisDAO.java +++ b/uk/ac/sanger/artemis/chado/IBatisDAO.java @@ -64,6 +64,8 @@ public class IBatisDAO extends GmodDAO private static org.apache.log4j.Logger logger4j = org.apache.log4j.Logger.getLogger(IBatisDAO.class); private SqlMapClientWrapper sqlMap; + private boolean featureCvTermRank = true; + private boolean featureCvTermRankChecked = false; /** * Define a iBatis data access object. This uses <code>DbSqlConfig</code> @@ -87,6 +89,33 @@ public class IBatisDAO extends GmodDAO sqlMap.close(); } + /** + * Test to see if this is an old chado database version + * without the feature_cvterm.rank column. + * @return true if the feature_cvterm.rank column exists. + */ + private boolean isFeatureCvTermRank() + { + if(featureCvTermRankChecked) + return featureCvTermRank; + + String schema = ArtemisUtils.getCurrentSchema(); + // check column names + List list = sqlMap.queryForList("getFeatureCvTermColumnsForASchema", schema); + featureCvTermRank = false; + for(int i=0; i<list.size(); i++) + { + if( ((String)list.get(i)).equals("rank") ) + { + featureCvTermRank = true; + break; + } + } + + featureCvTermRankChecked = true; + return featureCvTermRank; + } + ////// ////// GeneralDaoI ////// @@ -143,23 +172,7 @@ public class IBatisDAO extends GmodDAO public List getFeatureCvTermsBySrcFeature(Feature srcFeature) { -// find whether current schema has a feature_cvterm.rank column - String schema = ArtemisUtils.getCurrentSchema(); - - // check column names - List list = sqlMap.queryForList("getFeatureCvTermColumnsForASchema", schema); - - boolean rank_exists = false; - for(int i=0; i<list.size(); i++) - { - if( ((String)list.get(i)).equals("rank") ) - { - rank_exists = true; - break; - } - } - - if(rank_exists) + if(isFeatureCvTermRank()) { logger4j.debug("USE getFeatureCvTermsBySrcFeature()"); return sqlMap.queryForList("getFeatureCvTermsBySrcFeature", @@ -223,7 +236,11 @@ public class IBatisDAO extends GmodDAO org.gmod.schema.sequence.Feature feature = new org.gmod.schema.sequence.Feature(); feature.setFeatureId(id); - return (Feature)sqlMap.queryForObject("getLazyFeature", feature); + + if(isFeatureCvTermRank()) + return (Feature)sqlMap.queryForObject("getLazyFeature", feature); + else + return (Feature)sqlMap.queryForObject("getLazyFeatureNoFeatureCvTermRank", feature); } public List getFeaturesByListOfIds(final List featureIds) @@ -236,7 +253,11 @@ public class IBatisDAO extends GmodDAO org.gmod.schema.sequence.Feature feature = new org.gmod.schema.sequence.Feature(); feature.setUniqueName(uniquename); - return sqlMap.queryForList("getLazyFeature", feature); + + if(isFeatureCvTermRank()) + return sqlMap.queryForList("getLazyFeature", feature); + else + return sqlMap.queryForList("getLazyFeatureNoFeatureCvTermRank", feature); } public Feature getFeatureByUniqueName(String uniquename, String featureType) @@ -249,7 +270,10 @@ public class IBatisDAO extends GmodDAO cvTerm.setName(featureType); feature.setCvTerm(cvTerm); - return (Feature)sqlMap.queryForObject("getLazyFeature", feature); + if(isFeatureCvTermRank()) + return (Feature)sqlMap.queryForObject("getLazyFeature", feature); + else + return (Feature)sqlMap.queryForObject("getLazyFeatureNoFeatureCvTermRank", feature); } @@ -270,10 +294,10 @@ public class IBatisDAO extends GmodDAO feature.setUniqueName(name); feature.setFeatureSynonyms(feature_synonym_list); - List features = sqlMap.queryForList("getLazyFeature", feature); - - return features; - + if(isFeatureCvTermRank()) + return sqlMap.queryForList("getLazyFeature", feature); + else + return sqlMap.queryForList("getLazyFeatureNoFeatureCvTermRank", feature); } /** @@ -318,11 +342,10 @@ public class IBatisDAO extends GmodDAO */ public List getFeaturesByLocatedOnFeature(final Feature feature) { - List feature_list = sqlMap.queryForList("getFeature", feature); - - // merge same features in the list - //return mergeList(feature_list); - return feature_list; + if(isFeatureCvTermRank()) + return sqlMap.queryForList("getFeature", feature); + else + return sqlMap.queryForList("getFeatureNoFeatureCvTermRank", feature); } /** @@ -349,23 +372,7 @@ public class IBatisDAO extends GmodDAO */ public List getFeatureCvTermsByFeature(Feature feature) { - // find whether current schema has a feature_cvterm.rank column - String schema = ArtemisUtils.getCurrentSchema(); - - // check column names - List list = sqlMap.queryForList("getFeatureCvTermColumnsForASchema", schema); - - boolean rank_exists = false; - for(int i=0; i<list.size(); i++) - { - if( ((String)list.get(i)).equals("rank") ) - { - rank_exists = true; - break; - } - } - - if(rank_exists) + if(isFeatureCvTermRank()) return sqlMap.queryForList("getFeatureCvTermsByFeature", feature); else