diff --git a/artemis_sqlmap/FeatureCvTerm.xml b/artemis_sqlmap/FeatureCvTerm.xml index 29d98339a9f85c3cccf7704195dbe574e7d72ae4..85d460842add21578f8217599b03f2861ed35e86 100644 --- a/artemis_sqlmap/FeatureCvTerm.xml +++ b/artemis_sqlmap/FeatureCvTerm.xml @@ -22,6 +22,8 @@ <result property="pub.uniqueName" column="uniquename" /> <result property="cvTerm.dbXRef.accession" column="accession" /> <result property="cvTerm.dbXRef.db.name" column="name" /> + <result property="featureCvTermDbXRefs" column="feature_cvterm_id" + select="getFeatureCvTermDbXRefByFeatureCvTerm" /> <!-- <result property="pub" column="pub_id" select="selectPub" /> --> </resultMap> @@ -56,4 +58,17 @@ ORDER BY fc.feature_cvterm_id, fc.rank, type_id, fcp.rank; </select> + <delete id="deleteFeatureCvTerm" parameterClass="FeatureCvTerm"> + DELETE FROM feature_cvterm WHERE + feature_cvterm_id=$featureCvTermId$ + </delete> + + <!-- UPDATE --> + <update id="updateFeatureCvTerm" + parameterClass="FeatureCvTerm"> + UPDATE feature_cvterm + SET rank=$rank$ + WHERE feature_cvterm_id=$featureCvTermId$ + </update> + </sqlMap> \ No newline at end of file diff --git a/artemis_sqlmap/FeatureCvTermDbXRef.xml b/artemis_sqlmap/FeatureCvTermDbXRef.xml index 459aa9a4b23bd5917a8de432a01e2559ed85faac..409f8451ee34292ce26bb6d3e95a69a5b2301700 100644 --- a/artemis_sqlmap/FeatureCvTermDbXRef.xml +++ b/artemis_sqlmap/FeatureCvTermDbXRef.xml @@ -7,6 +7,9 @@ <typeAlias alias="FeatureCvTermDbXRef" type="org.gmod.schema.sequence.FeatureCvTermDbXRef"/> + + <typeAlias alias="FeatureCvTerm" + type="org.gmod.schema.sequence.FeatureCvTerm"/> <resultMap id="select-featurecvtermdbxref" class="FeatureCvTermDbXRef" groupBy="featureCvTermId"> @@ -32,4 +35,12 @@ </dynamic> </select> + <select id="getFeatureCvTermDbXRefByFeatureCvTerm" parameterClass="java.lang.Integer" + resultMap="select-featurecvtermdbxref"> + SELECT fcd.feature_cvterm_id, dbx.*, db.name + FROM feature_cvterm_dbxref fcd + LEFT JOIN dbxref dbx ON dbx.dbxref_id=fcd.dbxref_id + LEFT JOIN db ON db.db_id=dbx.db_id + WHERE feature_cvterm_id=$feature_cvterm_id$ + </select> </sqlMap> \ No newline at end of file diff --git a/uk/ac/sanger/artemis/chado/ChadoTransactionManager.java b/uk/ac/sanger/artemis/chado/ChadoTransactionManager.java index 0dfa0f5b5b4e42f60adf4eae2eac964ab854b843..4f20b63d11db0046754e0e1be1f4bd26422b588e 100644 --- a/uk/ac/sanger/artemis/chado/ChadoTransactionManager.java +++ b/uk/ac/sanger/artemis/chado/ChadoTransactionManager.java @@ -54,6 +54,7 @@ import java.util.List; import java.util.Enumeration; import javax.swing.JOptionPane; +import org.gmod.schema.sequence.FeatureCvTermProp; import org.gmod.schema.sequence.FeatureLoc; import org.gmod.schema.sequence.FeatureProp; import org.gmod.schema.sequence.FeatureDbXRef; @@ -1113,7 +1114,8 @@ public class ChadoTransactionManager tsn = new ChadoTransaction(ChadoTransaction.DELETE, old_dbxref, - feature.getLastModified(), feature); + feature.getLastModified(), feature); + sql.add(tsn); } else if(qualifier_name.equals("codon_start")) { @@ -1127,13 +1129,56 @@ public class ChadoTransactionManager } else if(isCvTag(qualifier_name)) { + /*Qualifier qual = feature.getQualifierByName(qualifier_name); + StringVector values = qual.getValues(); + int beginIndex = qualifier_string.indexOf("term=")+5; + int endIndex = qualifier_string.indexOf(";",beginIndex); + final String thisTerm; + if(endIndex > -1) + thisTerm = qualifier_string.substring(beginIndex, endIndex); + else + thisTerm = qualifier_string.substring(beginIndex);*/ + Splash.logger4j.debug(uniquename+" in handleReservedTags() DELETE "+ qualifier_name+" "+qualifier_string); + FeatureCvTerm feature_cvterm = getFeatureCvTerm(qualifier_name, qualifier_string, uniquename); + /*Vector rankables = null; + int rank = 0; + for(int j=0; j<values.size(); j++) + { + String val = (String)values.get(j); + if(val.indexOf(thisTerm) > -1 && + !val.equals(qualifier_string)) + { + if(rankables == null) + rankables = new Vector(); + + FeatureCvTerm fc = getFeatureCvTerm(qualifier_name, val, + uniquename); + fc.setRank(rank); + rankables.add(fc); + rank++; + System.out.println("UPDATE ------> "+values.get(j)); + } + }*/ + tsn = new ChadoTransaction(ChadoTransaction.DELETE, feature_cvterm, - feature.getLastModified(), feature); + feature.getLastModified(), feature); + sql.add(tsn); + + /*if(rankables != null) + { + for(int j=0; j<rankables.size(); j++) + { + feature_cvterm = (FeatureCvTerm)rankables.get(j); + tsn = new ChadoTransaction(ChadoTransaction.UPDATE, + feature_cvterm, + feature.getLastModified(), feature); + } + }*/ } else if(isSynonymTag(qualifier_name)) { @@ -1145,9 +1190,10 @@ public class ChadoTransactionManager tsn = new ChadoTransaction(ChadoTransaction.DELETE, feature_synonym, - feature.getLastModified(), feature); + feature.getLastModified(), feature); + sql.add(tsn); } - sql.add(tsn); + } } @@ -1404,6 +1450,7 @@ public class ChadoTransactionManager return feature_cvterm; } + List featureCvTermProps = new Vector(); StringVector strings = StringVector.getStrings(qualifier_string, ";"); for(int i=0; i<strings.size(); i++) { @@ -1452,8 +1499,19 @@ public class ChadoTransactionManager // feature_cvterm_prop's + if(this_qualifier_part.toLowerCase().startsWith("evidence=")) + { + String evidence = this_qualifier_part.substring(9); + FeatureCvTermProp featureCvTermProp = new FeatureCvTermProp(); + featureCvTermProp.setValue(evidence); + featureCvTermProps.add(featureCvTermProp); + + continue; + } } + feature_cvterm.setFeatureCvTermProps(featureCvTermProps); + Splash.logger4j.debug("Finished building FeatureCvTerm for "+uniqueName); return feature_cvterm; } diff --git a/uk/ac/sanger/artemis/chado/IBatisDAO.java b/uk/ac/sanger/artemis/chado/IBatisDAO.java index 742ac5edf1a2dc20de29a8d3063da4d5ad06d40f..5f4097df5370e18cc8d485d4db413715daa7af2b 100644 --- a/uk/ac/sanger/artemis/chado/IBatisDAO.java +++ b/uk/ac/sanger/artemis/chado/IBatisDAO.java @@ -31,6 +31,7 @@ import java.sql.*; import org.gmod.schema.sequence.Feature; import org.gmod.schema.sequence.FeatureCvTerm; +import org.gmod.schema.sequence.FeatureCvTermDbXRef; import org.gmod.schema.sequence.FeatureDbXRef; import org.gmod.schema.sequence.FeatureProp; import org.gmod.schema.sequence.Synonym; @@ -450,6 +451,9 @@ public class IBatisDAO extends GmodDAO sqlMap.update("updateFeatureProp", o); else if(o instanceof FeatureRelationship) sqlMap.update("updateFeatureRelationshipsForSubjectId", o); + else if(o instanceof FeatureCvTerm) + sqlMap.update("updateFeatureCvTerm", o); + } @@ -490,6 +494,8 @@ public class IBatisDAO extends GmodDAO sqlMap.delete("deleteFeatureDbXRef", o); else if(o instanceof FeatureSynonym) deleteFeatureSynonym((FeatureSynonym)o); + else if(o instanceof FeatureCvTerm) + deleteFeatureCvTerm((FeatureCvTerm)o); } @@ -627,6 +633,97 @@ public class IBatisDAO extends GmodDAO return sqlMap.delete("deleteAlias", feature_synonym); } + /** + * Delete featureCvTerm and update associated feature_cvterm.rank's + * if appropriate + * @param featureCvTerm + */ + private void deleteFeatureCvTerm(FeatureCvTerm featureCvTerm) + { + List featureCvTerms = getFeatureCvTermsByFeature(featureCvTerm.getFeature()); + + List featureCvTermDbXRefs = new Vector();; + + if(featureCvTerm.getFeatureCvTermDbXRefs() != null && + featureCvTerm.getFeatureCvTermDbXRefs().size() > 0) + featureCvTermDbXRefs = (List)featureCvTerm.getFeatureCvTermDbXRefs(); + + // delete feature_cvterm and update ranks if asppropriate + FeatureCvTerm deleteme = null; + Vector rankable = null; + + for(int i=0; i<featureCvTerms.size(); i++) + { + FeatureCvTerm this_feature_cvterm = (FeatureCvTerm)featureCvTerms.get(i); + if(this_feature_cvterm.getCvTerm().getName().equals( + featureCvTerm.getCvTerm().getName() )) + { + List this_featureCvTermDbXRefs = (List)this_feature_cvterm.getFeatureCvTermDbXRefs(); + + if(this_featureCvTermDbXRefs == null) + this_featureCvTermDbXRefs = new Vector(); + + if(this_featureCvTermDbXRefs.size() != featureCvTermDbXRefs.size()) + { + if(rankable == null) + rankable = new Vector(); + + rankable.add(this_feature_cvterm); + continue; + } + + boolean found = true; + for(int j=0; j<this_featureCvTermDbXRefs.size(); j++) + { + FeatureCvTermDbXRef fcd = (FeatureCvTermDbXRef)this_featureCvTermDbXRefs.get(j); + if(!containsFeatureCvTermDbXRef(fcd, featureCvTermDbXRefs)) + { + found = false; + break; + } + } + if(!found) + { + if(rankable == null) + rankable = new Vector(); + + rankable.add(this_feature_cvterm); + continue; + } + deleteme = this_feature_cvterm; + } + } + sqlMap.delete("deleteFeatureCvTerm", deleteme); + + if(rankable != null) + { + + // feature_cvterm.rank needs updating for those stored here + System.out.println( "********> "+ deleteme.getCvTerm().getCv().getName() + " rank = " + + deleteme.getRank()); + for(int i=0; i<rankable.size(); i++) + { + FeatureCvTerm fc = (FeatureCvTerm)rankable.get(i); + System.out.println( "********> "+ fc.getCvTerm().getCv().getName() + " rank = " + + fc.getRank()); + fc.setRank(i); + sqlMap.delete("updateFeatureCvTerm", fc); + } + } + } + + private boolean containsFeatureCvTermDbXRef(FeatureCvTermDbXRef fcd, List featureCvTermDbXRefs) + { + for(int i=0; i<featureCvTermDbXRefs.size(); i++) + { + FeatureCvTermDbXRef this_fcd = (FeatureCvTermDbXRef)featureCvTermDbXRefs.get(i); + if( this_fcd.getDbXRef().getAccession().equals( fcd.getDbXRef().getAccession() ) && + this_fcd.getDbXRef().getDb().getName().equals( fcd.getDbXRef().getDb().getName() )) + return true; + } + return false; + } + public void startTransaction() throws SQLException { sqlMap.startTransaction();