You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by hu...@apache.org on 2023/04/13 16:17:15 UTC

[iotdb] 02/04: add allSatisfy interface

This is an automated email from the ASF dual-hosted git repository.

hui pushed a commit to branch lmh/FixOffsetPushDown
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 0e703d1d6014694d3c670bdedc9a383e0e6df1a3
Author: liuminghui233 <54...@qq.com>
AuthorDate: Thu Apr 13 22:22:49 2023 +0800

    add allSatisfy interface
---
 .../iotdb/tsfile/read/filter/GroupByFilter.java    |  5 +++++
 .../iotdb/tsfile/read/filter/basic/Filter.java     |  7 +++++++
 .../tsfile/read/filter/operator/AndFilter.java     |  5 +++++
 .../iotdb/tsfile/read/filter/operator/Between.java | 23 ++++++++++++++++++++++
 .../iotdb/tsfile/read/filter/operator/Eq.java      | 14 +++++++++++++
 .../iotdb/tsfile/read/filter/operator/Gt.java      | 12 +++++++++++
 .../iotdb/tsfile/read/filter/operator/GtEq.java    | 12 +++++++++++
 .../iotdb/tsfile/read/filter/operator/In.java      |  5 +++++
 .../iotdb/tsfile/read/filter/operator/Like.java    |  5 +++++
 .../iotdb/tsfile/read/filter/operator/Lt.java      | 12 +++++++++++
 .../iotdb/tsfile/read/filter/operator/LtEq.java    | 12 +++++++++++
 .../iotdb/tsfile/read/filter/operator/NotEq.java   | 14 +++++++++++++
 .../tsfile/read/filter/operator/NotFilter.java     |  5 +++++
 .../tsfile/read/filter/operator/OrFilter.java      |  5 +++++
 .../iotdb/tsfile/read/filter/operator/Regexp.java  |  5 +++++
 15 files changed, 141 insertions(+)

diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/GroupByFilter.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/GroupByFilter.java
index 851d122bab..50dc156c1f 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/GroupByFilter.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/GroupByFilter.java
@@ -53,6 +53,11 @@ public class GroupByFilter implements Filter, Serializable {
     return satisfyStartEndTime(statistics.getStartTime(), statistics.getEndTime());
   }
 
+  @Override
+  public boolean allSatisfy(Statistics statistics) {
+    return satisfyStartEndTime(statistics.getStartTime(), statistics.getEndTime());
+  }
+
   @Override
   public boolean satisfy(long time, Object value) {
     if (time < startTime || time >= endTime) {
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/Filter.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/Filter.java
index dc0d479c83..2d6335814c 100755
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/Filter.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/basic/Filter.java
@@ -38,6 +38,13 @@ public interface Filter {
    */
   boolean satisfy(Statistics statistics);
 
+  /**
+   * To examine whether all data points are satisfied with the filter.
+   *
+   * @param statistics statistics with min time, max time, min value, max value.
+   */
+  boolean allSatisfy(Statistics statistics);
+
   /**
    * To examine whether the single point(with time and value) is satisfied with the filter.
    *
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/AndFilter.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/AndFilter.java
index 6c5120a3f7..d06fb8b7cb 100755
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/AndFilter.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/AndFilter.java
@@ -43,6 +43,11 @@ public class AndFilter extends BinaryFilter {
     return left.satisfy(statistics) && right.satisfy(statistics);
   }
 
+  @Override
+  public boolean allSatisfy(Statistics statistics) {
+    return left.allSatisfy(statistics) && right.allSatisfy(statistics);
+  }
+
   @Override
   public boolean satisfy(long time, Object value) {
     return left.satisfy(time, value) && right.satisfy(time, value);
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Between.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Between.java
index 0ca994f315..6277bc270c 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Between.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Between.java
@@ -100,6 +100,29 @@ public class Between<T extends Comparable<T>> implements Filter {
     }
   }
 
+  @Override
+  public boolean allSatisfy(Statistics statistics) {
+    if (filterType == FilterType.TIME_FILTER) {
+      long time1 = (Long) value1, time2 = (Long) value2;
+      if (not) {
+        return statistics.getStartTime() < time1 || statistics.getEndTime() > time2;
+      } else {
+        return statistics.getEndTime() >= time1 || statistics.getStartTime() <= time2;
+      }
+    } else {
+      if (statistics.getType() == TSDataType.TEXT || statistics.getType() == TSDataType.BOOLEAN) {
+        return false;
+      }
+      if (not) {
+        return ((T) statistics.getMinValue()).compareTo(value1) < 0
+            || ((T) statistics.getMaxValue()).compareTo(value2) > 0;
+      } else {
+        return ((T) statistics.getMaxValue()).compareTo(value1) >= 0
+            && ((T) statistics.getMinValue()).compareTo(value2) <= 0;
+      }
+    }
+  }
+
   @Override
   public boolean satisfy(long time, Object value) {
     Object v = filterType == FilterType.TIME_FILTER ? time : value;
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Eq.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Eq.java
index 7a69be9468..08c269e521 100755
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Eq.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Eq.java
@@ -54,6 +54,20 @@ public class Eq<T extends Comparable<T>> extends UnaryFilter<T> {
     }
   }
 
+  @Override
+  public boolean allSatisfy(Statistics statistics) {
+    if (filterType == FilterType.TIME_FILTER) {
+      return ((Long) value) >= statistics.getStartTime()
+          && ((Long) value) <= statistics.getEndTime();
+    } else {
+      if (statistics.getType() == TSDataType.TEXT || statistics.getType() == TSDataType.BOOLEAN) {
+        return false;
+      }
+      return value.compareTo((T) statistics.getMinValue()) >= 0
+          && value.compareTo((T) statistics.getMaxValue()) <= 0;
+    }
+  }
+
   @Override
   public boolean satisfy(long time, Object value) {
     Object v = filterType == FilterType.TIME_FILTER ? time : value;
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Gt.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Gt.java
index 0719397e8c..0648bbf2f5 100755
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Gt.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Gt.java
@@ -52,6 +52,18 @@ public class Gt<T extends Comparable<T>> extends UnaryFilter<T> {
     }
   }
 
+  @Override
+  public boolean allSatisfy(Statistics statistics) {
+    if (filterType == FilterType.TIME_FILTER) {
+      return ((Long) value) < statistics.getEndTime();
+    } else {
+      if (statistics.getType() == TSDataType.TEXT || statistics.getType() == TSDataType.BOOLEAN) {
+        return false;
+      }
+      return value.compareTo((T) statistics.getMaxValue()) < 0;
+    }
+  }
+
   @Override
   public boolean satisfy(long time, Object value) {
     Object v = filterType == FilterType.TIME_FILTER ? time : value;
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/GtEq.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/GtEq.java
index 4e811e14fe..7dcab1443c 100755
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/GtEq.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/GtEq.java
@@ -52,6 +52,18 @@ public class GtEq<T extends Comparable<T>> extends UnaryFilter<T> {
     }
   }
 
+  @Override
+  public boolean allSatisfy(Statistics statistics) {
+    if (filterType == FilterType.TIME_FILTER) {
+      return ((Long) value) <= statistics.getEndTime();
+    } else {
+      if (statistics.getType() == TSDataType.TEXT || statistics.getType() == TSDataType.BOOLEAN) {
+        return false;
+      }
+      return value.compareTo((T) statistics.getMaxValue()) <= 0;
+    }
+  }
+
   @Override
   public boolean satisfy(long time, Object value) {
     Object v = filterType == FilterType.TIME_FILTER ? time : value;
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/In.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/In.java
index 60e0747f5d..9a28682d25 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/In.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/In.java
@@ -61,6 +61,11 @@ public class In<T extends Comparable<T>> implements Filter {
     return true;
   }
 
+  @Override
+  public boolean allSatisfy(Statistics statistics) {
+    return false;
+  }
+
   @Override
   public boolean satisfy(long time, Object value) {
     Object v = filterType == FilterType.TIME_FILTER ? time : value;
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Like.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Like.java
index fac3dfcf5b..425ed321c6 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Like.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Like.java
@@ -89,6 +89,11 @@ public class Like<T extends Comparable<T>> implements Filter {
     return true;
   }
 
+  @Override
+  public boolean allSatisfy(Statistics statistics) {
+    return false;
+  }
+
   @Override
   public boolean satisfy(long time, Object value) {
     if (filterType != FilterType.VALUE_FILTER) {
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Lt.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Lt.java
index 9c83b720c2..14d39e2fed 100755
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Lt.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Lt.java
@@ -52,6 +52,18 @@ public class Lt<T extends Comparable<T>> extends UnaryFilter<T> {
     }
   }
 
+  @Override
+  public boolean allSatisfy(Statistics statistics) {
+    if (filterType == FilterType.TIME_FILTER) {
+      return ((Long) value) > statistics.getStartTime();
+    } else {
+      if (statistics.getType() == TSDataType.TEXT || statistics.getType() == TSDataType.BOOLEAN) {
+        return false;
+      }
+      return value.compareTo((T) statistics.getMinValue()) > 0;
+    }
+  }
+
   @Override
   public boolean satisfy(long time, Object value) {
     Object v = filterType == FilterType.TIME_FILTER ? time : value;
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/LtEq.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/LtEq.java
index b68b1b4759..343a325021 100755
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/LtEq.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/LtEq.java
@@ -52,6 +52,18 @@ public class LtEq<T extends Comparable<T>> extends UnaryFilter<T> {
     }
   }
 
+  @Override
+  public boolean allSatisfy(Statistics statistics) {
+    if (filterType == FilterType.TIME_FILTER) {
+      return ((Long) value) >= statistics.getStartTime();
+    } else {
+      if (statistics.getType() == TSDataType.TEXT || statistics.getType() == TSDataType.BOOLEAN) {
+        return false;
+      }
+      return value.compareTo((T) statistics.getMinValue()) >= 0;
+    }
+  }
+
   @Override
   public boolean satisfy(long time, Object value) {
     Object v = filterType == FilterType.TIME_FILTER ? time : value;
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/NotEq.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/NotEq.java
index 55abda179e..55be826df0 100755
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/NotEq.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/NotEq.java
@@ -54,6 +54,20 @@ public class NotEq<T extends Comparable<T>> extends UnaryFilter<T> {
     }
   }
 
+  @Override
+  public boolean allSatisfy(Statistics statistics) {
+    if (filterType == FilterType.TIME_FILTER) {
+      return !(((Long) value) == statistics.getStartTime()
+          && (Long) value == statistics.getEndTime());
+    } else {
+      if (statistics.getType() == TSDataType.TEXT || statistics.getType() == TSDataType.BOOLEAN) {
+        return false;
+      }
+      return !(value.compareTo((T) statistics.getMinValue()) == 0
+          && value.compareTo((T) statistics.getMaxValue()) == 0);
+    }
+  }
+
   @Override
   public boolean satisfy(long time, Object value) {
     Object v = filterType == FilterType.TIME_FILTER ? time : value;
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/NotFilter.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/NotFilter.java
index cd983dc329..8d46624ff5 100755
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/NotFilter.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/NotFilter.java
@@ -49,6 +49,11 @@ public class NotFilter implements Filter, Serializable {
     return !that.satisfy(statistics);
   }
 
+  @Override
+  public boolean allSatisfy(Statistics statistics) {
+    return !that.allSatisfy(statistics);
+  }
+
   @Override
   public boolean satisfy(long time, Object value) {
     return !that.satisfy(time, value);
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/OrFilter.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/OrFilter.java
index 17b0935510..37b3d7d566 100755
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/OrFilter.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/OrFilter.java
@@ -55,6 +55,11 @@ public class OrFilter extends BinaryFilter implements Serializable {
     return left.satisfy(statistics) || right.satisfy(statistics);
   }
 
+  @Override
+  public boolean allSatisfy(Statistics statistics) {
+    return left.allSatisfy(statistics) || right.allSatisfy(statistics);
+  }
+
   @Override
   public boolean satisfy(long time, Object value) {
     return left.satisfy(time, value) || right.satisfy(time, value);
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Regexp.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Regexp.java
index 31e7260469..7a66c14f61 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Regexp.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/filter/operator/Regexp.java
@@ -62,6 +62,11 @@ public class Regexp<T extends Comparable<T>> implements Filter {
     return true;
   }
 
+  @Override
+  public boolean allSatisfy(Statistics statistics) {
+    return false;
+  }
+
   @Override
   public boolean satisfy(long time, Object value) {
     if (filterType != FilterType.VALUE_FILTER) {