You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by st...@apache.org on 2008/10/29 18:41:43 UTC

svn commit: r708949 - in /hadoop/hbase/trunk: CHANGES.txt src/java/org/apache/hadoop/hbase/rest/GenericHandler.java src/java/org/apache/hadoop/hbase/rest/RowHandler.java src/java/org/apache/hadoop/hbase/rest/TableHandler.java

Author: stack
Date: Wed Oct 29 10:41:42 2008
New Revision: 708949

URL: http://svn.apache.org/viewvc?rev=708949&view=rev
Log:
HBASE-960 REST interface: more generic column family configure and also get Rows using offset and limit

Modified:
    hadoop/hbase/trunk/CHANGES.txt
    hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/rest/GenericHandler.java
    hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/rest/RowHandler.java
    hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/rest/TableHandler.java

Modified: hadoop/hbase/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/CHANGES.txt?rev=708949&r1=708948&r2=708949&view=diff
==============================================================================
--- hadoop/hbase/trunk/CHANGES.txt (original)
+++ hadoop/hbase/trunk/CHANGES.txt Wed Oct 29 10:41:42 2008
@@ -79,6 +79,8 @@
                (Sishen Freecity via Stack)
    HBASE-936   REST Interface: enable get number of rows from scanner interface
                (Sishen Freecity via Stack)
+   HBASE-960   REST interface: more generic column family configure and also
+               get Rows using offset and limit (Sishen Freecity via Stack)
     
   NEW FEATURES
    HBASE-875   Use MurmurHash instead of JenkinsHash [in bloomfilters]

Modified: hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/rest/GenericHandler.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/rest/GenericHandler.java?rev=708949&r1=708948&r2=708949&view=diff
==============================================================================
--- hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/rest/GenericHandler.java (original)
+++ hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/rest/GenericHandler.java Wed Oct 29 10:41:42 2008
@@ -230,10 +230,35 @@
    * @throws IllegalArgumentException
    * @throws IOException
    */
-  protected void outputColumnsXml(final XMLOutputter outputter,
-    final Map<byte [], Cell> m)
+  protected void outputColumnsXml(final XMLOutputter outputter, final Map<byte [], Cell> m)
   throws IllegalStateException, IllegalArgumentException, IOException {
+    outputColumnsXml(null, outputter, m);
+  }
+  
+  protected void outputColumnsXml(final HttpServletRequest request,
+      final XMLOutputter outputter, final Map<byte [], Cell> m)
+  throws IllegalStateException, IllegalArgumentException, IOException {
+    int offset = 0, limit = Integer.MAX_VALUE;
+    if (request != null) {
+      String offset_string = request.getParameter(OFFSET);
+      if (offset_string != null && !offset_string.equals(""))
+        offset = Integer.parseInt(offset_string);
+      String limit_string = request.getParameter(LIMIT);
+      if (limit_string != null && !limit_string.equals("")) {
+        limit = Integer.parseInt(limit_string);
+      }
+    }
+    
     for (Map.Entry<byte [], Cell> e: m.entrySet()) {
+      if (offset > 0) {
+        --offset;
+        continue;
+      }
+      if (limit < 1) {
+        break;
+      } else {
+        --limit;
+      }
       outputter.startTag(COLUMN);
       doElement(outputter, "name", 
         org.apache.hadoop.hbase.util.Base64.encodeBytes(e.getKey()));
@@ -242,10 +267,36 @@
     }
   }
 
-  protected void outputColumnsWithMultiVersionsXml(final XMLOutputter outputter,
-    final Map<byte [], Cell[]> m)
+  protected void outputColumnsWithMultiVersionsXml(final XMLOutputter outputter, 
+      final Map<byte [], Cell[]> m)
   throws IllegalStateException, IllegalArgumentException, IOException {
+    outputColumnsWithMultiVersionsXml(null, outputter, m);
+  }
+  
+  protected void outputColumnsWithMultiVersionsXml(final HttpServletRequest request, 
+      final XMLOutputter outputter, final Map<byte [], Cell[]> m)
+  throws IllegalStateException, IllegalArgumentException, IOException {
+    int offset = 0, limit = Integer.MAX_VALUE;
+    if (request != null) {
+      String offset_string = request.getParameter(OFFSET);
+      if (offset_string != null && !offset_string.equals(""))
+        offset = Integer.parseInt(offset_string);
+      String limit_string = request.getParameter(LIMIT);
+      if (limit_string != null && !limit_string.equals("")) {
+        limit = Integer.parseInt(limit_string);
+      }
+    }
+    
     for (Map.Entry<byte [], Cell[]> e: m.entrySet()) {
+      if (offset > 0) {
+        --offset;
+        continue;
+      }
+      if (limit < 1) {
+        break;
+      } else {
+        --limit;
+      }
       for (Cell c : e.getValue()) {
         outputter.startTag(COLUMN);
         doElement(outputter, "name", 

Modified: hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/rest/RowHandler.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/rest/RowHandler.java?rev=708949&r1=708948&r2=708949&view=diff
==============================================================================
--- hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/rest/RowHandler.java (original)
+++ hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/rest/RowHandler.java Wed Oct 29 10:41:42 2008
@@ -28,7 +28,7 @@
 
 public class RowHandler extends GenericHandler {
 
-	public RowHandler(HBaseConfiguration conf, HBaseAdmin admin)
+  public RowHandler(HBaseConfiguration conf, HBaseAdmin admin)
 	throws ServletException {
 		super(conf, admin);
 	}
@@ -121,7 +121,7 @@
       } else {
         switch (ContentType.getContentType(request.getHeader(ACCEPT))) {
         case XML:
-          outputRowWithMultiVersionsXml(response, result);
+          outputRowWithMultiVersionsXml(request, response, result);
           break;
         case MIME:
         default:
@@ -136,7 +136,7 @@
       } else {
         switch (ContentType.getContentType(request.getHeader(ACCEPT))) {
         case XML:
-          outputRowXml(response, result);
+          outputRowXml(request, response, result);
           break;
         case MIME:
         default:
@@ -153,27 +153,29 @@
    * @param result
    * @throws IOException
    */
-  private void outputRowXml(final HttpServletResponse response,
-      final Map<byte [], Cell> result)
+  private void outputRowXml(final HttpServletRequest request, 
+      final HttpServletResponse response, final Map<byte [], Cell> result)
   throws IOException {
     setResponseHeader(response, result.size() > 0? 200: 204,
         ContentType.XML.toString());
     XMLOutputter outputter = getXMLOutputter(response.getWriter());
     outputter.startTag(ROW);
-    outputColumnsXml(outputter, result);
+    doElement(outputter, "count", String.valueOf(result.size()));
+    outputColumnsXml(request, outputter, result);
     outputter.endTag();
     outputter.endDocument();
     outputter.getWriter().close();
   }
   
-  private void outputRowWithMultiVersionsXml(final HttpServletResponse response,
-      final Map<byte[], Cell[]> result) 
+  private void outputRowWithMultiVersionsXml(final HttpServletRequest request, 
+      final HttpServletResponse response, final Map<byte[], Cell[]> result) 
   throws IOException {
     setResponseHeader(response, result.size() > 0? 200: 204,
         ContentType.XML.toString());
     XMLOutputter outputter = getXMLOutputter(response.getWriter());
     outputter.startTag(ROW);
-    outputColumnsWithMultiVersionsXml(outputter, result);
+    doElement(outputter, "count", String.valueOf(result.size()));    
+    outputColumnsWithMultiVersionsXml(request, outputter, result);
     outputter.endTag();
     outputter.endDocument();
     outputter.getWriter().close();   

Modified: hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/rest/TableHandler.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/rest/TableHandler.java?rev=708949&r1=708948&r2=708949&view=diff
==============================================================================
--- hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/rest/TableHandler.java (original)
+++ hadoop/hbase/trunk/src/java/org/apache/hadoop/hbase/rest/TableHandler.java Wed Oct 29 10:41:42 2008
@@ -321,7 +321,7 @@
 
       for (int i = 0; i < columnfamily_nodes.getLength(); i++) {
         Element columnfamily = (Element) columnfamily_nodes.item(i);
-        HColumnDescriptor hcd = putColumnFamilyXml(columnfamily);
+        HColumnDescriptor hcd = putColumnFamilyXml(columnfamily, htd);
         if (htd.hasFamily(Bytes.toBytes(hcd.getNameAsString()))) {
           admin.modifyColumn(tableName, hcd.getNameAsString(), hcd);
         } else {
@@ -334,45 +334,83 @@
   }
   
   private HColumnDescriptor putColumnFamilyXml(Element columnfamily) {
+    return putColumnFamilyXml(columnfamily, null);
+  }
+  
+  private HColumnDescriptor putColumnFamilyXml(Element columnfamily, HTableDescriptor currentTDesp) {
     Node name_node = columnfamily.getElementsByTagName("name").item(0);
     String colname = makeColumnName(name_node.getFirstChild().getNodeValue());
     
     int max_versions = HColumnDescriptor.DEFAULT_VERSIONS;
+    CompressionType compression = HColumnDescriptor.DEFAULT_COMPRESSION;
+    boolean in_memory = HColumnDescriptor.DEFAULT_IN_MEMORY;
+    boolean block_cache = HColumnDescriptor.DEFAULT_BLOCKCACHE;
+    int max_cell_size = HColumnDescriptor.DEFAULT_LENGTH;
+    int ttl = HColumnDescriptor.DEFAULT_TTL;
+    boolean bloomfilter = HColumnDescriptor.DEFAULT_BLOOMFILTER;
+    
+    if (currentTDesp != null) {
+      HColumnDescriptor currentCDesp = currentTDesp.getFamily(Bytes.toBytes(colname));
+      if (currentCDesp != null) {
+        max_versions = currentCDesp.getMaxVersions();
+        compression = currentCDesp.getCompression();
+        in_memory = currentCDesp.isInMemory();
+        block_cache = currentCDesp.isBlockCacheEnabled();
+        max_cell_size = currentCDesp.getMaxValueLength();
+        ttl = currentCDesp.getTimeToLive();
+        bloomfilter = currentCDesp.isBloomfilter();
+      }
+    }
+    
     NodeList max_versions_list = columnfamily.getElementsByTagName("max-versions");
     if (max_versions_list.getLength() > 0) {
       max_versions = Integer.parseInt(max_versions_list.item(0).getFirstChild().getNodeValue());
     }
-    CompressionType compression = HColumnDescriptor.DEFAULT_COMPRESSION;
+
     NodeList compression_list = columnfamily.getElementsByTagName("compression");
     if (compression_list.getLength() > 0) {
       compression = CompressionType.valueOf(compression_list.item(0).getFirstChild().getNodeValue());
     }
-    boolean in_memory = HColumnDescriptor.DEFAULT_IN_MEMORY;
+
     NodeList in_memory_list = columnfamily.getElementsByTagName("in-memory");
     if (in_memory_list.getLength() > 0) {
       in_memory = Boolean.valueOf(in_memory_list.item(0).getFirstChild().getNodeValue());
     }
-    boolean block_cache = HColumnDescriptor.DEFAULT_BLOCKCACHE;
+    
     NodeList block_cache_list = columnfamily.getElementsByTagName("block-cache");
     if (block_cache_list.getLength() > 0) {
       block_cache = Boolean.valueOf(block_cache_list.item(0).getFirstChild().getNodeValue());
     }
-    int max_cell_size = HColumnDescriptor.DEFAULT_LENGTH;
+
     NodeList max_cell_size_list = columnfamily.getElementsByTagName("max-cell-size");
     if (max_cell_size_list.getLength() > 0) {
       max_cell_size = Integer.valueOf(max_cell_size_list.item(0).getFirstChild().getNodeValue());
     }
-    int ttl = HColumnDescriptor.DEFAULT_TTL;
+
     NodeList ttl_list = columnfamily.getElementsByTagName("time-to-live");
     if (ttl_list.getLength() > 0) {
       ttl = Integer.valueOf(ttl_list.item(0).getFirstChild().getNodeValue());
     }
-    boolean bloomfilter = HColumnDescriptor.DEFAULT_BLOOMFILTER;
+
     NodeList bloomfilter_list = columnfamily.getElementsByTagName("bloomfilter");
     if (bloomfilter_list.getLength() > 0) {
       bloomfilter = Boolean.valueOf(bloomfilter_list.item(0).getFirstChild().getNodeValue());
     }
-    return new HColumnDescriptor(Bytes.toBytes(colname), max_versions,
+    
+    HColumnDescriptor hcd = new HColumnDescriptor(Bytes.toBytes(colname), max_versions,
         compression, in_memory, block_cache, max_cell_size, ttl, bloomfilter);
+    
+    NodeList metadataList = columnfamily.getElementsByTagName("metadata");
+    for (int i = 0; i < metadataList.getLength(); i++) {
+      Element metadataColumn = (Element)metadataList.item(i);
+      // extract the name and value children
+      Node mname_node = metadataColumn.getElementsByTagName("name").item(0);
+      String mname = mname_node.getFirstChild().getNodeValue();
+      Node mvalue_node = metadataColumn.getElementsByTagName("value").item(0);
+      String mvalue = mvalue_node.getFirstChild().getNodeValue();
+      hcd.setValue(mname, mvalue);
+    }
+    
+    return hcd;
   }
 }