ref #8509 add included taxon relationship export to PESI
authorAndreas Müller <a.mueller@bgbm.org>
Sun, 6 Oct 2019 22:42:26 +0000 (00:42 +0200)
committerAndreas Müller <a.mueller@bgbm.org>
Sun, 6 Oct 2019 22:42:26 +0000 (00:42 +0200)
cdm-pesi/src/main/java/eu/etaxonomy/cdm/io/pesi/out/PesiExportBase.java
cdm-pesi/src/main/java/eu/etaxonomy/cdm/io/pesi/out/PesiRelTaxonExport.java

index cfb2a1f208f76d38f7a3cdfcc82cf9ba4f0a713a..7068ec093e3fa7f29b642249e398a98069b120a7 100644 (file)
@@ -43,6 +43,7 @@ import eu.etaxonomy.cdm.model.reference.Reference;
 import eu.etaxonomy.cdm.model.taxon.Synonym;\r
 import eu.etaxonomy.cdm.model.taxon.Taxon;\r
 import eu.etaxonomy.cdm.model.taxon.TaxonBase;\r
+import eu.etaxonomy.cdm.model.taxon.TaxonNode;\r
 import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;\r
 import eu.etaxonomy.cdm.model.taxon.TaxonRelationshipType;\r
 import eu.etaxonomy.cdm.persistence.query.OrderHint;\r
@@ -194,6 +195,37 @@ public abstract class PesiExportBase
                return result;\r
        }\r
 \r
+    protected List<TaxonNode> getNextTaxonNodePartition( int limit, int partitionCount, List<String> propertyPaths) {\r
+\r
+        List<TaxonNode> result = new ArrayList<>();\r
+\r
+        List<OrderHint> orderHints = null;\r
+        @SuppressWarnings("unchecked")\r
+        List<TaxonNode> list = this.getTaxonNodeService()\r
+            .list(TaxonNode.class, limit, limit * partitionCount, orderHints, propertyPaths);\r
+\r
+        if (list.isEmpty()){\r
+            return null;\r
+        }\r
+\r
+        for (TaxonNode tn : list){\r
+            if (isPesiTaxonNode(tn)){\r
+                result.add(tn);\r
+            }\r
+        }\r
+        return result;\r
+    }\r
+\r
+    protected boolean isPesiTaxonNode(TaxonNode tn){\r
+        TaxonBase<?> fromTaxon;\r
+        Taxon toTaxon;\r
+\r
+        fromTaxon = tn.getTaxon();\r
+        toTaxon = tn.getParent()== null? null: tn.getParent().getTaxon();\r
+\r
+        return (isPesiTaxon(fromTaxon, true) && isPesiTaxon(toTaxon, true));\r
+    }\r
+\r
        protected boolean isPesiNameRelationship(RelationshipBase<?,?,?> rel){\r
                TaxonName name1;\r
                TaxonName name2;\r
index 2b4ef4e12407f5cd2c80323e561a37ae68d40211..b64d11d72a75188b4e94220dfeef20cd7ffeec15 100644 (file)
@@ -19,6 +19,8 @@ import org.springframework.transaction.TransactionStatus;
 
 import eu.etaxonomy.cdm.io.common.Source;
 import eu.etaxonomy.cdm.io.common.mapping.out.DbAnnotationMapper;
+import eu.etaxonomy.cdm.io.common.mapping.out.DbFixedIntegerMapper;
+import eu.etaxonomy.cdm.io.common.mapping.out.DbFixedStringMapper;
 import eu.etaxonomy.cdm.io.common.mapping.out.DbObjectMapper;
 import eu.etaxonomy.cdm.io.common.mapping.out.MethodMapper;
 import eu.etaxonomy.cdm.model.common.CdmBase;
@@ -31,6 +33,7 @@ import eu.etaxonomy.cdm.model.name.TaxonName;
 import eu.etaxonomy.cdm.model.taxon.Synonym;
 import eu.etaxonomy.cdm.model.taxon.Taxon;
 import eu.etaxonomy.cdm.model.taxon.TaxonBase;
+import eu.etaxonomy.cdm.model.taxon.TaxonNode;
 import eu.etaxonomy.cdm.model.taxon.TaxonRelationship;
 
 /**
@@ -54,6 +57,7 @@ public class PesiRelTaxonExport extends PesiExportBase {
 
        private PesiExportMapping mapping;
        private PesiExportMapping synonymMapping;
+       private PesiExportMapping taxonNodeMapping;
 
        public PesiRelTaxonExport() {
                super();
@@ -89,9 +93,17 @@ public class PesiRelTaxonExport extends PesiExportBase {
             synonymMapping = getSynonymMapping();
             synonymMapping.initialize(state);
 
+            // Get specific mappings: (CDM) Synonym -> (PESI) RelTaxon
+            taxonNodeMapping = getTaxonNodeMapping();
+            taxonNodeMapping.initialize(state);
+
+
                        //Export taxon relations
                        success &= doPhase01(state, mapping);
 
+                       //Export taxon nodes
+            success &= doPhase01b(state, taxonNodeMapping);
+
                        // Export name relations
                        success &= doPhase02(state, mapping);
 
@@ -181,6 +193,39 @@ public class PesiRelTaxonExport extends PesiExportBase {
                return success;
        }
 
+    private boolean doPhase01b(PesiExportState state, PesiExportMapping taxonNodeMapping) {
+        logger.info("PHASE 1b: Taxonnodes ...");
+        boolean success = true;
+
+        int limit = state.getConfig().getLimitSave();
+        // Start transaction
+        TransactionStatus txStatus = startTransaction(true);
+        logger.debug("Started new transaction. Fetching some " + pluralString + " (max: " + limit + ") ...");
+
+        List<TaxonNode> list;
+
+        //taxon nodes
+        int partitionCount = 0;
+        int totalCount = 0;
+        while ((list = getNextTaxonNodePartition(limit, partitionCount++, null)) != null) {
+            totalCount = totalCount + list.size();
+            logger.info("Read " + list.size() + " PESI taxon nodes. Limit: " + limit + ". Total: " + totalCount );
+            for (TaxonNode tn : list){
+                try {
+                    taxonNodeMapping.invoke(tn);
+                } catch (Exception e) {
+                    logger.error(e.getMessage() + ". TaxonNode: " +  tn.getUuid());
+                    e.printStackTrace();
+                }
+            }
+
+            commitTransaction(txStatus);
+            txStatus = startTransaction();
+        }
+        commitTransaction(txStatus);
+        return success;
+    }
+
        private boolean doPhase02(PesiExportState state, PesiExportMapping mapping2) {
                logger.info("PHASE 2: Name Relationships ...");
                boolean success = true;
@@ -314,6 +359,20 @@ public class PesiRelTaxonExport extends PesiExportBase {
         return state.getDbId(synonym);
     }
 
+    /**
+     * Returns the <code>TaxonFk1</code> attribute. It corresponds to a CDM <code>Synonym</code>.
+     * @param synonym The {@link Synonym synonym}.
+     * @param state The {@link PesiExportState PesiExportState}.
+     * @return The <code>TaxonFk1</code> attribute.
+     * @see MethodMapper
+     */
+    @SuppressWarnings("unused")
+    private static Integer getParent(TaxonNode taxonNode, PesiExportState state) {
+        TaxonNode parent = taxonNode == null? null : taxonNode.getParent();
+        Taxon parentTaxon = parent == null? null: parent.getTaxon();
+        return state.getDbId(parentTaxon);
+    }
+
        /**
         * Returns the <code>TaxonFk2</code> attribute. It corresponds to a CDM <code>SynonymRelationship</code>.
         * @param relationship The {@link RelationshipBase Relationship}.
@@ -455,6 +514,19 @@ public class PesiRelTaxonExport extends PesiExportBase {
         return mapping;
     }
 
+    PesiExportMapping getTaxonNodeMapping() {
+        PesiExportMapping mapping = new PesiExportMapping(dbTableName);
+
+        mapping.addMapper(MethodMapper.NewInstance("TaxonFk2", this.getClass(), "getParent", TaxonNode.class, PesiExportState.class));
+        mapping.addMapper(DbObjectMapper.NewInstance("taxon", "TaxonFk1"));
+        mapping.addMapper(DbFixedIntegerMapper.NewInstance(101, "RelTaxonQualifierFk"));
+        mapping.addMapper(DbFixedStringMapper.NewInstance("is taxonomically included in", "RelQualifierCache"));
+//        mapping.addMapper(DbAnnotationMapper.NewExludedInstance(getLastActionAnnotationTypes(), "Notes"));
+
+        return mapping;
+    }
+
+
 
     @Override
     protected boolean doCheck(PesiExportState state) {