You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ji...@apache.org on 2020/02/27 09:44:50 UTC

[incubator-iotdb] branch master updated: fix AndNode NullPointer (#851)

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

jiangtian pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-iotdb.git


The following commit(s) were added to refs/heads/master by this push:
     new 907176c  fix AndNode NullPointer (#851)
907176c is described below

commit 907176c338c2d8838d0c75720b6a5105eb161474
Author: Jialin Qiao <qj...@mails.tsinghua.edu.cn>
AuthorDate: Thu Feb 27 17:44:42 2020 +0800

    fix AndNode NullPointer (#851)
---
 .../read/query/timegenerator/node/AndNode.java     | 14 ++++-
 .../read/query/timegenerator/node/LeafNode.java    | 11 ++--
 .../tsfile/read/query/timegenerator/NodeTest.java  | 66 +++++-----------------
 .../iotdb/tsfile/read/reader/FakedBatchReader.java | 55 ++++++++++++++++++
 4 files changed, 90 insertions(+), 56 deletions(-)

diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/query/timegenerator/node/AndNode.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/query/timegenerator/node/AndNode.java
index fa679c1..1b298ba 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/query/timegenerator/node/AndNode.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/query/timegenerator/node/AndNode.java
@@ -58,6 +58,10 @@ public class AndNode implements Node {
     fillLeftCache();
     fillRightCache();
 
+    if (!hasLeftValue() || !hasRightValue()) {
+      return false;
+    }
+
     while (leftTimeColumn.hasCurrent() && rightTimeColumn.hasCurrent()) {
       long leftValue = leftTimeColumn.currentTime();
       long rightValue = rightTimeColumn.currentTime();
@@ -94,6 +98,14 @@ public class AndNode implements Node {
     }
   }
 
+  private boolean hasLeftValue() {
+    return leftTimeColumn != null && leftTimeColumn.hasCurrent();
+  }
+
+  private boolean hasRightValue() {
+    return rightTimeColumn != null && rightTimeColumn.hasCurrent();
+  }
+
   //no more data in cache and has more data in child
   private boolean couldFillCache(TimeColumn timeSeries, Node child) throws IOException {
     return (timeSeries == null || !timeSeries.hasCurrent()) && child.hasNextTimeColumn();
@@ -115,4 +127,4 @@ public class AndNode implements Node {
   public NodeType getType() {
     return NodeType.AND;
   }
-}
+}
\ No newline at end of file
diff --git a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/query/timegenerator/node/LeafNode.java b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/query/timegenerator/node/LeafNode.java
index 3f255af..c0051d8 100644
--- a/tsfile/src/main/java/org/apache/iotdb/tsfile/read/query/timegenerator/node/LeafNode.java
+++ b/tsfile/src/main/java/org/apache/iotdb/tsfile/read/query/timegenerator/node/LeafNode.java
@@ -40,10 +40,13 @@ public class LeafNode implements Node {
     if (hasCached) {
       return true;
     }
-    if (reader.hasNextBatch()) {
-      hasCached = true;
+    while (reader.hasNextBatch()) {
       cacheData = reader.nextBatch();
-      cachedTimeSeries = cacheData.getTimeColumn();
+      if (cacheData.hasCurrent()) {
+        hasCached = true;
+        cachedTimeSeries = cacheData.getTimeColumn();
+        break;
+      }
     }
     return hasCached;
   }
@@ -82,4 +85,4 @@ public class LeafNode implements Node {
     return NodeType.LEAF;
   }
 
-}
+}
\ No newline at end of file
diff --git a/tsfile/src/test/java/org/apache/iotdb/tsfile/read/query/timegenerator/NodeTest.java b/tsfile/src/test/java/org/apache/iotdb/tsfile/read/query/timegenerator/NodeTest.java
index e4ad037..6037993 100644
--- a/tsfile/src/test/java/org/apache/iotdb/tsfile/read/query/timegenerator/NodeTest.java
+++ b/tsfile/src/test/java/org/apache/iotdb/tsfile/read/query/timegenerator/NodeTest.java
@@ -18,15 +18,14 @@
  */
 package org.apache.iotdb.tsfile.read.query.timegenerator;
 
-import org.apache.iotdb.tsfile.file.metadata.ChunkMetaData;
-import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
-import org.apache.iotdb.tsfile.read.common.BatchData;
 import org.apache.iotdb.tsfile.read.common.TimeColumn;
 import org.apache.iotdb.tsfile.read.query.timegenerator.node.AndNode;
 import org.apache.iotdb.tsfile.read.query.timegenerator.node.LeafNode;
 import org.apache.iotdb.tsfile.read.query.timegenerator.node.Node;
 import org.apache.iotdb.tsfile.read.query.timegenerator.node.NodeType;
 import org.apache.iotdb.tsfile.read.query.timegenerator.node.OrNode;
+import org.apache.iotdb.tsfile.read.reader.FakedBatchReader;
+import org.apache.iotdb.tsfile.read.reader.IBatchReader;
 import org.apache.iotdb.tsfile.read.reader.series.AbstractFileSeriesReader;
 import org.junit.Assert;
 import org.junit.Test;
@@ -44,13 +43,17 @@ public class NodeTest {
 
   @Test
   public void testLeafNode() throws IOException {
-    int index = 0;
     long[] timestamps = new long[]{1, 2, 3, 4, 5, 6, 7};
-    AbstractFileSeriesReader seriesReader = new FakedFileSeriesReader(timestamps);
-    Node leafNode = new LeafNode(seriesReader);
-    while (leafNode.hasNextTimeColumn()) {
-      Assert.assertEquals(timestamps[index++], leafNode.nextTimeColumn().currentTime());
+    IBatchReader batchReader = new FakedBatchReader(timestamps);
+    Node leafNode = new LeafNode(batchReader);
+
+    Assert.assertTrue(leafNode.hasNextTimeColumn());
+    TimeColumn timeColumn = leafNode.nextTimeColumn();
+    for (long timestamp : timestamps) {
+      Assert.assertEquals(timestamp, timeColumn.currentTime());
+      timeColumn.next();
     }
+    Assert.assertFalse(leafNode.hasNextTimeColumn());
   }
 
   @Test
@@ -69,8 +72,8 @@ public class NodeTest {
 
   private void testOr(long[] ret, long[] left, long[] right) throws IOException {
     int index = 0;
-    Node orNode = new OrNode(new LeafNode(new FakedFileSeriesReader(left)),
-        new LeafNode(new FakedFileSeriesReader(right)));
+    Node orNode = new OrNode(new LeafNode(new FakedBatchReader(left)),
+        new LeafNode(new FakedBatchReader(right)));
     while (orNode.hasNextTimeColumn()) {
       TimeColumn timeSeries = orNode.nextTimeColumn();
       while (timeSeries.hasCurrent()) {
@@ -93,8 +96,8 @@ public class NodeTest {
 
   private void testAnd(long[] ret, long[] left, long[] right) throws IOException {
     int index = 0;
-    Node andNode = new AndNode(new LeafNode(new FakedFileSeriesReader(left)),
-        new LeafNode(new FakedFileSeriesReader(right)));
+    Node andNode = new AndNode(new LeafNode(new FakedBatchReader(left)),
+        new LeafNode(new FakedBatchReader(right)));
     while (andNode.hasNextTimeColumn()) {
       TimeColumn timeSeries = andNode.nextTimeColumn();
       while (timeSeries.hasCurrent()) {
@@ -106,44 +109,5 @@ public class NodeTest {
     Assert.assertEquals(ret.length, index);
   }
 
-  private static class FakedFileSeriesReader extends AbstractFileSeriesReader {
-
-    BatchData data;
-    boolean hasCachedData;
-
-    public FakedFileSeriesReader(long[] timestamps) {
-      super(null, null, null);
-      data = new BatchData(TSDataType.INT32);
-      for (long time : timestamps) {
-        data.putInt(time, 1);
-      }
-      hasCachedData = true;
-    }
-
-    @Override
-    public boolean hasNextBatch() {
-      return hasCachedData;
-    }
-
-    @Override
-    public BatchData nextBatch() {
-      hasCachedData = false;
-      return data;
-    }
 
-    @Override
-    protected void initChunkReader(ChunkMetaData chunkMetaData) throws IOException {
-
-    }
-
-    @Override
-    protected boolean chunkSatisfied(ChunkMetaData chunkMetaData) {
-      return false;
-    }
-
-    @Override
-    public void close() {
-
-    }
-  }
 }
diff --git a/tsfile/src/test/java/org/apache/iotdb/tsfile/read/reader/FakedBatchReader.java b/tsfile/src/test/java/org/apache/iotdb/tsfile/read/reader/FakedBatchReader.java
new file mode 100644
index 0000000..3ed5df0
--- /dev/null
+++ b/tsfile/src/test/java/org/apache/iotdb/tsfile/read/reader/FakedBatchReader.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.iotdb.tsfile.read.reader;
+
+import java.io.IOException;
+import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
+import org.apache.iotdb.tsfile.read.common.BatchData;
+
+public class FakedBatchReader implements IBatchReader {
+
+  private BatchData data;
+  private boolean hasCached = false;
+
+  public FakedBatchReader(long[] timestamps) {
+    data = new BatchData(TSDataType.INT32);
+    for (long time : timestamps) {
+      data.putInt(time, 1);
+      hasCached = true;
+    }
+  }
+
+  @Override
+  public boolean hasNextBatch() {
+    return hasCached;
+  }
+
+  @Override
+  public BatchData nextBatch() throws IOException {
+    if (data == null || !data.hasCurrent()) {
+      throw new IOException("no next batch");
+    }
+    hasCached = false;
+    return data;
+  }
+
+  @Override
+  public void close() {
+  }
+}
\ No newline at end of file