Skip to content

v0.2.53..v0.2.54 changeset NonConflatableCriterion.cpp

Garret Voltz edited this page Mar 31, 2020 · 1 revision
diff --git a/hoot-core/src/main/cpp/hoot/core/criterion/NonConflatableCriterion.cpp b/hoot-core/src/main/cpp/hoot/core/criterion/NonConflatableCriterion.cpp
index 910246d..d43fb49 100644
--- a/hoot-core/src/main/cpp/hoot/core/criterion/NonConflatableCriterion.cpp
+++ b/hoot-core/src/main/cpp/hoot/core/criterion/NonConflatableCriterion.cpp
@@ -37,13 +37,17 @@ namespace hoot
 HOOT_FACTORY_REGISTER(ElementCriterion, NonConflatableCriterion)
 
 NonConflatableCriterion::NonConflatableCriterion() :
-_ignoreChildren(false)
+_ignoreChildren(false),
+_geometryTypeFilter(GeometryTypeCriterion::GeometryType::Unknown),
+_ignoreGenericConflators(false)
 {
 }
 
 NonConflatableCriterion::NonConflatableCriterion(ConstOsmMapPtr map) :
 _map(map),
-_ignoreChildren(false)
+_ignoreChildren(false),
+_geometryTypeFilter(GeometryTypeCriterion::GeometryType::Unknown),
+_ignoreGenericConflators(false)
 {
 }
 
@@ -72,18 +76,36 @@ bool NonConflatableCriterion::isSatisfied(const ConstElementPtr& e) const
       }
     }
 
-    if (crit->isSatisfied(e))
+    if (_ignoreGenericConflators)
+    {
+      std::shared_ptr<ConflatableElementCriterion> conflatableCrit =
+        std::dynamic_pointer_cast<ConflatableElementCriterion>(crit);
+      assert(conflatableCrit);
+      if (!conflatableCrit->supportsSpecificConflation())
+      {
+        continue;
+      }
+    }
+
+    bool satisfiesGeometryFilter = true;
+    if (_geometryTypeFilter != GeometryTypeCriterion::GeometryType::Unknown)
+    {
+      std::shared_ptr<GeometryTypeCriterion> geometryCrit =
+        std::dynamic_pointer_cast<GeometryTypeCriterion>(crit);
+      satisfiesGeometryFilter = geometryCrit->getGeometryType() == _geometryTypeFilter;
+    }
+
+    if (crit->isSatisfied(e) && satisfiesGeometryFilter)
     {
       // It is something we can conflate.
-      // TODO: change back to trace
-      LOG_DEBUG("Element: " << e->getElementId() << " is conflatable with: " << itr.key());
+      LOG_TRACE("Element: " << e->getElementId() << " is conflatable with: " << itr.key());
       return false;
     }
   }
 
   // Technically, there could also be something like a building way with a POI child and you'd want
-  // to check for ways here as well. Will wait to support that until an actual use case is
-  // encountered.
+  // to check for ways here as well. Will wait to support that situation until an actual use case
+  // is encountered.
   if (!_ignoreChildren && e->getElementType() == ElementType::Relation)
   {
     // We need to verify that none of the child relation members are conflatable in order to sign
@@ -98,7 +120,7 @@ bool NonConflatableCriterion::isSatisfied(const ConstElementPtr& e) const
       if (memberElement && isSatisfied(memberElement))
       {
         // It is something we can conflate.
-        LOG_DEBUG(
+        LOG_TRACE(
           "Element: " << e->getElementId() << " has a child that is conflatable: " <<
           memberElement->getElementId() << ", and member children are not being ignored, " <<
           "therefore it is conflatable.");
@@ -108,7 +130,7 @@ bool NonConflatableCriterion::isSatisfied(const ConstElementPtr& e) const
   }
 
   // It is not something we can conflate.
-  LOG_DEBUG("Element: " << e->getElementId() << " is not conflatable.");
+  LOG_TRACE("Element: " << e->getElementId() << " is not conflatable.");
   LOG_VART(e);
   return true;
 }
Clone this wiki locally