You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by ra...@apache.org on 2014/10/13 08:29:32 UTC

git commit: PHOENIX-1333 - Store statistics guideposts as VARBINARY (Add missing file GuidePostsInfo.java)

Repository: phoenix
Updated Branches:
  refs/heads/3.0 75484fb32 -> 4c8798d57


PHOENIX-1333 - Store statistics guideposts as VARBINARY (Add missing file
GuidePostsInfo.java)


Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo
Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/4c8798d5
Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/4c8798d5
Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/4c8798d5

Branch: refs/heads/3.0
Commit: 4c8798d57653e33c1fe1b68acd8a3a7569e79080
Parents: 75484fb
Author: Ramkrishna <ra...@intel.com>
Authored: Mon Oct 13 11:58:41 2014 +0530
Committer: Ramkrishna <ra...@intel.com>
Committed: Mon Oct 13 11:58:41 2014 +0530

----------------------------------------------------------------------
 .../phoenix/schema/stats/GuidePostsInfo.java    | 144 +++++++++++++++++++
 1 file changed, 144 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/phoenix/blob/4c8798d5/phoenix-core/src/main/java/org/apache/phoenix/schema/stats/GuidePostsInfo.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/schema/stats/GuidePostsInfo.java b/phoenix-core/src/main/java/org/apache/phoenix/schema/stats/GuidePostsInfo.java
new file mode 100644
index 0000000..6484349
--- /dev/null
+++ b/phoenix-core/src/main/java/org/apache/phoenix/schema/stats/GuidePostsInfo.java
@@ -0,0 +1,144 @@
+package org.apache.phoenix.schema.stats;
+
+import java.io.ByteArrayInputStream;
+import java.io.DataInputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.util.List;
+
+import org.apache.hadoop.hbase.util.Bytes;
+import org.apache.hadoop.io.WritableUtils;
+import org.apache.phoenix.util.TrustedByteArrayOutputStream;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterators;
+import com.google.common.collect.Lists;
+/*
+ * 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.
+ */
+/**
+ *  A simple POJO class that holds the information related to GuidePosts serDe.
+ */
+public class GuidePostsInfo {
+    private long byteCount; // Number of bytes traversed in the region
+    private long keyByteSize; // Total number of bytes in keys stored in guidePosts
+    private List<byte[]> guidePosts;
+
+    public GuidePostsInfo(long byteCount, List<byte[]> guidePosts) {
+        this.byteCount = byteCount;
+        this.guidePosts = ImmutableList.copyOf(guidePosts);
+        int size = 0;
+        for (byte[] key : guidePosts) {
+            size += key.length;
+        }
+        this.keyByteSize = size;
+    }
+
+    public boolean addGuidePost(byte[] row, long byteCount) {
+        if (guidePosts.isEmpty() || Bytes.compareTo(row, guidePosts.get(guidePosts.size() - 1)) > 0) {
+            List<byte[]> newGuidePosts = Lists.newArrayListWithExpectedSize(this.getGuidePosts().size() + 1);
+            newGuidePosts.addAll(guidePosts);
+            newGuidePosts.add(row);
+            this.guidePosts = ImmutableList.copyOf(newGuidePosts);
+            this.byteCount += byteCount;
+            this.keyByteSize += row.length;
+            return true;
+        }
+        return false;
+    }
+    
+    public void combine(GuidePostsInfo oldInfo) {
+        // FIXME: I don't think we need to do a merge sort here, as the keys won't be interleaved.
+        // We just need to concatenate them in the correct way.
+        this.guidePosts = ImmutableList.copyOf(Iterators.mergeSorted(ImmutableList.of(this.getGuidePosts().iterator(), oldInfo.getGuidePosts().iterator()), Bytes.BYTES_COMPARATOR));
+        this.byteCount += oldInfo.getByteCount();
+        this.keyByteSize += oldInfo.keyByteSize;
+    }
+    
+    public long getByteCount() {
+        return byteCount;
+    }
+
+    public List<byte[]> getGuidePosts() {
+        return guidePosts;
+    }
+
+    public static GuidePostsInfo fromBytes(byte[] buf, int offset, int l) {
+        try {
+            ByteArrayInputStream bytesIn = new ByteArrayInputStream(buf, offset, l);
+            try {
+                DataInputStream in = new DataInputStream(bytesIn);
+                try {
+                    long byteCount = in.readLong();
+                    int guidepostsCount = in.readInt();
+                    List<byte[]> guidePosts = Lists.newArrayListWithExpectedSize(guidepostsCount);
+                    if (guidepostsCount > 0) {
+                        for (int i = 0; i < guidepostsCount; i++) {
+                            int length = WritableUtils.readVInt(in);
+                            byte[] gp = new byte[length];
+                            in.read(gp);
+                            if (gp.length != 0) {
+                                guidePosts.add(gp);
+                            }
+                        }
+                    }
+                    return new GuidePostsInfo(byteCount, guidePosts);
+                } catch (IOException e) {
+                    throw new RuntimeException(e); // not possible
+                } finally {
+                    try {
+                        in.close();
+                    } catch (IOException e) {
+                        throw new RuntimeException(e); // not possible
+                    }
+                }
+            } finally {
+                bytesIn.close();
+            }
+        } catch (IOException e) {
+            throw new RuntimeException(e); // not possible
+        }
+    }
+    
+    public byte[] toBytes() {
+        int size = guidePosts.size();
+        // Serialize the number of bytes traversed, number of key bytes in the region,
+        // number of guideposts for that family, <<guidepostSize><guidePostsArray>,<guidePostsSize> <guidePostArray>>
+        // We will lose precision here?
+        TrustedByteArrayOutputStream bs = new TrustedByteArrayOutputStream(
+                (int)(Bytes.SIZEOF_LONG + Bytes.SIZEOF_LONG + Bytes.SIZEOF_INT + this.keyByteSize + (WritableUtils
+                        .getVIntSize(size) * size)));
+        DataOutputStream os = new DataOutputStream(bs);
+        try {
+            os.writeLong(this.getByteCount());
+            os.writeInt(size);
+            for (byte[] element : guidePosts) {
+                WritableUtils.writeVInt(os, element.length);
+                os.write(element);
+            }
+            return bs.toByteArray();
+        } catch (IOException ioe) {
+            throw new RuntimeException(ioe); // not possible
+        } finally {
+            try {
+                os.close();
+            } catch (IOException ioe) {
+                throw new RuntimeException(ioe); // not possible
+            }
+        }
+    }
+}
\ No newline at end of file