AlgaTerra categorical data and flat classifications
[cdmlib.git] / cdmlib-io / src / main / java / eu / etaxonomy / cdm / io / berlinModel / in / BerlinModelTaxonRelationImport.java
index c61ac39b393852bf4013f01496e96afab851ac7e..71d88bca95980844d2b959eda187ec61b3a98104 100644 (file)
@@ -31,6 +31,7 @@ import java.util.UUID;
 \r
 import org.apache.log4j.Logger;\r
 import org.springframework.stereotype.Component;\r
+import org.springframework.transaction.TransactionStatus;\r
 \r
 import eu.etaxonomy.cdm.common.CdmUtils;\r
 import eu.etaxonomy.cdm.common.ResultWrapper;\r
@@ -83,7 +84,6 @@ public class BerlinModelTaxonRelationImport  extends BerlinModelImportBase  {
        private void makeClassifications(BerlinModelImportState state) throws SQLException{\r
                logger.info("start make classification ...");\r
                \r
-               \r
                Set<String> idSet = getTreeReferenceIdSet(state);\r
                \r
                //nom reference map\r
@@ -178,7 +178,25 @@ public class BerlinModelTaxonRelationImport  extends BerlinModelImportBase  {
                        }\r
                }\r
                \r
+               boolean includeFlatClassifications = state.getConfig().isIncludeFlatClassifications();\r
                String strQuery = strQuerySelect + " " + strQueryFrom + " " + strQueryWhere + " " + strQueryGroupBy;\r
+               \r
+               //concepts with \r
+               if (includeFlatClassifications){\r
+                       String strFlatQuery = \r
+                                       " SELECT pt.PTRefFk AS secRefFk, dbo.Reference.RefCache AS secRef " +\r
+                                       " FROM PTaxon AS pt LEFT OUTER JOIN " + \r
+                                                 " Reference ON pt.PTRefFk = dbo.Reference.RefId LEFT OUTER JOIN " +\r
+                                                 " RelPTaxon ON pt.PTNameFk = dbo.RelPTaxon.PTNameFk2 AND pt.PTRefFk = dbo.RelPTaxon.PTRefFk2 LEFT OUTER JOIN " +\r
+                                                 " RelPTaxon AS RelPTaxon_1 ON pt.PTNameFk = RelPTaxon_1.PTNameFk1 AND pt.PTRefFk = RelPTaxon_1.PTRefFk1 " + \r
+                                       " WHERE (RelPTaxon_1.RelQualifierFk IS NULL) AND (dbo.RelPTaxon.RelQualifierFk IS NULL) " + \r
+                                       " GROUP BY pt.PTRefFk, dbo.Reference.RefCache "\r
+                                       ;\r
+                       \r
+                       strQuery = strQuery + " UNION " + strFlatQuery;\r
+               }\r
+               \r
+               \r
                if (state.getConfig().getClassificationQuery() != null){\r
                        strQuery = state.getConfig().getClassificationQuery();\r
                }\r
@@ -350,6 +368,7 @@ public class BerlinModelTaxonRelationImport  extends BerlinModelImportBase  {
                try {\r
                        makeClassifications(state);\r
                        super.doInvoke(state);\r
+                       makeFlatClassificationTaxa(state);\r
                        return;\r
                } catch (SQLException e) {\r
                        throw new RuntimeException(e);\r
@@ -358,6 +377,48 @@ public class BerlinModelTaxonRelationImport  extends BerlinModelImportBase  {
        }\r
        \r
        \r
+       private void makeFlatClassificationTaxa(BerlinModelImportState state) {\r
+               //Note: this part still does not use partitions\r
+               logger.info("Flat classifications start");\r
+               TransactionStatus txStatus = startTransaction();\r
+               if (! state.getConfig().isIncludeFlatClassifications()){\r
+                       return;\r
+               }\r
+               String sql = " SELECT pt.PTRefFk AS secRefFk, pt.RIdentifier " +\r
+                                               " FROM PTaxon AS pt " +\r
+                                                       " LEFT OUTER JOIN RelPTaxon ON pt.PTNameFk = RelPTaxon.PTNameFk2 AND pt.PTRefFk = RelPTaxon.PTRefFk2 " +\r
+                                                       "  LEFT OUTER JOIN RelPTaxon AS RelPTaxon_1 ON pt.PTNameFk = RelPTaxon_1.PTNameFk1 AND pt.PTRefFk = RelPTaxon_1.PTRefFk1 " +\r
+                                               " WHERE (RelPTaxon_1.RelQualifierFk IS NULL) AND (dbo.RelPTaxon.RelQualifierFk IS NULL) " +\r
+                                               " ORDER BY pt.PTRefFk " ;\r
+               ResultSet rs = state.getConfig().getSource().getResultSet(sql);\r
+               Map<Object, Map<String, ? extends CdmBase>> maps = getRelatedObjectsForFlatPartition(rs);\r
+               \r
+               Map<String, TaxonBase> taxonMap = (Map<String, TaxonBase>) maps.get(BerlinModelTaxonImport.NAMESPACE);\r
+               Map<Integer, Classification> classificationMap = new HashMap<Integer, Classification>();\r
+                               \r
+               rs = state.getConfig().getSource().getResultSet(sql);\r
+               try {\r
+                       while (rs.next()){\r
+                               Integer treeRefFk = rs.getInt("secRefFk");\r
+                               String taxonId = rs.getString("RIdentifier");\r
+                               Classification classification = getClassificationTree(state, classificationMap, treeRefFk);\r
+                               TaxonBase<?> taxon = taxonMap.get(taxonId);\r
+                               if (taxon.isInstanceOf(Taxon.class)){\r
+                                       classification.addChildTaxon(CdmBase.deproxy(taxon, Taxon.class), null, null, null);\r
+                               }else{\r
+                                       String message = "TaxonBase for taxon is not of class Taxon but %s (RIdentifier %s)";\r
+                                       logger.warn(String.format(message, taxon.getClass(), taxonId));\r
+                               }\r
+                       }\r
+               } catch (SQLException e) {\r
+                       // TODO Auto-generated catch block\r
+                       e.printStackTrace();\r
+               }\r
+               commitTransaction(txStatus);\r
+               logger.info("Flat classifications end");\r
+               \r
+       }\r
+\r
        /* (non-Javadoc)\r
         * @see eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportBase#getIdQuery(eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportState)\r
         */\r
@@ -427,6 +488,47 @@ public class BerlinModelTaxonRelationImport  extends BerlinModelImportBase  {
                }\r
                return result;\r
        }\r
+       \r
+       /* (non-Javadoc)\r
+        * @see eu.etaxonomy.cdm.io.berlinModel.in.IPartitionedIO#getRelatedObjectsForPartition(java.sql.ResultSet)\r
+        */\r
+       public Map<Object, Map<String, ? extends CdmBase>> getRelatedObjectsForFlatPartition( ResultSet rs) {\r
+               String nameSpace;\r
+               Class cdmClass;\r
+               Set<String> idSet;\r
+               Map<Object, Map<String, ? extends CdmBase>> result = new HashMap<Object, Map<String, ? extends CdmBase>>();\r
+               \r
+               try{\r
+                       Set<String> taxonIdSet = new HashSet<String>();\r
+                       Set<String> referenceIdSet = new HashSet<String>();\r
+//                     Set<String> classificationIdSet = new HashSet<String>();\r
+                       while (rs.next()){\r
+                               handleForeignKey(rs, taxonIdSet, "RIdentifier");\r
+//                             handleForeignKey(rs, classificationIdSet, "treeRefFk");\r
+       }\r
+       \r
+                       //taxon map\r
+                       nameSpace = BerlinModelTaxonImport.NAMESPACE;\r
+                       cdmClass = TaxonBase.class;\r
+                       idSet = taxonIdSet;\r
+                       Map<String, TaxonBase> taxonMap = (Map<String, TaxonBase>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);\r
+                       result.put(nameSpace, taxonMap);\r
+\r
+//                     //tree map\r
+//                     nameSpace = "Classification";\r
+//                     cdmClass = Classification.class;\r
+//                     idSet = classificationIdSet;\r
+//                     Map<String, Classification> treeMap = (Map<String, Classification>)getCommonService().getSourcedObjectsByIdInSource(cdmClass, idSet, nameSpace);\r
+//                     result.put(cdmClass, treeMap);\r
+//                     Set<UUID> treeUuidSet = state\r
+//                     getClassificationService().find(uuidSet);\r
+//                     \r
+\r
+               } catch (SQLException e) {\r
+                       throw new RuntimeException(e);\r
+               }\r
+               return result;\r
+       }\r
 \r
 \r
        private SynonymRelationship getSynRel (int relQualifierFk, Taxon toTaxon, Synonym synonym, Reference citation, String microcitation){\r