You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@gora.apache.org by al...@apache.org on 2013/03/13 17:33:40 UTC
svn commit: r1456041 - in /gora/branches/GORA_174/gora-hbase/src:
main/java/org/apache/gora/hbase/util/HBaseByteInterface.java
test/java/org/apache/gora/hbase/store/TestHBaseStore.java
Author: alfonsonishikawa
Date: Wed Mar 13 16:33:39 2013
New Revision: 1456041
URL: http://svn.apache.org/r1456041
Log:
Gora-hbase: Commited partial patch GORA-207 from 12/Mar/2013
Modified:
gora/branches/GORA_174/gora-hbase/src/main/java/org/apache/gora/hbase/util/HBaseByteInterface.java
gora/branches/GORA_174/gora-hbase/src/test/java/org/apache/gora/hbase/store/TestHBaseStore.java
Modified: gora/branches/GORA_174/gora-hbase/src/main/java/org/apache/gora/hbase/util/HBaseByteInterface.java
URL: http://svn.apache.org/viewvc/gora/branches/GORA_174/gora-hbase/src/main/java/org/apache/gora/hbase/util/HBaseByteInterface.java?rev=1456041&r1=1456040&r2=1456041&view=diff
==============================================================================
--- gora/branches/GORA_174/gora-hbase/src/main/java/org/apache/gora/hbase/util/HBaseByteInterface.java (original)
+++ gora/branches/GORA_174/gora-hbase/src/main/java/org/apache/gora/hbase/util/HBaseByteInterface.java Wed Mar 13 16:33:39 2013
@@ -34,6 +34,8 @@ import org.apache.avro.specific.Specific
import org.apache.avro.specific.SpecificDatumWriter;
import org.apache.avro.util.Utf8;
import org.apache.gora.util.AvroUtils;
+import org.apache.gora.avro.PersistentDatumReader;
+import org.apache.gora.avro.PersistentDatumWriter;
import org.apache.hadoop.hbase.util.Bytes;
/**
@@ -99,12 +101,26 @@ public class HBaseByteInterface {
case FLOAT: return Bytes.toFloat(val);
case DOUBLE: return Bytes.toDouble(val);
case BOOLEAN: return val[0] != 0;
+ case UNION:
case RECORD:
Map<String, SpecificDatumReader<?>> readerMap = readerMaps.get();
- SpecificDatumReader<?> reader = readerMap.get(schema.getFullName());
- if (reader == null) {
- reader = new SpecificDatumReader(schema);
- readerMap.put(schema.getFullName(), reader);
+ PersistentDatumReader<?> reader = null ;
+
+ // For UNION schemas, must use a specific (UNION-type-type-type)
+ // since unions don't have own name
+ if (schema.getType().equals(Schema.Type.UNION)) {
+ reader = (PersistentDatumReader<?>)readerMap.get(String.valueOf(schema.hashCode()));
+ if (reader == null) {
+ reader = new PersistentDatumReader(schema, false);// ignore dirty bits
+ readerMap.put(String.valueOf(schema.hashCode()), reader);
+ }
+ } else {
+ // ELSE use reader for Record
+ reader = (PersistentDatumReader<?>)readerMap.get(schema.getFullName());
+ if (reader == null) {
+ reader = new PersistentDatumReader(schema, false);// ignore dirty bits
+ readerMap.put(schema.getFullName(), reader);
+ }
}
// initialize a decoder, possibly reusing previous one
@@ -116,7 +132,7 @@ public class HBaseByteInterface {
decoders.set(decoder);
}
- return reader.read(null, decoder);
+ return reader.read((Object)null, schema, decoder);
default: throw new RuntimeException("Unknown type: "+type);
}
}
@@ -183,12 +199,25 @@ public class HBaseByteInterface {
case DOUBLE: return Bytes.toBytes((Double)o);
case BOOLEAN: return (Boolean)o ? new byte[] {1} : new byte[] {0};
case ENUM: return new byte[] { (byte)((Enum<?>) o).ordinal() };
+ case UNION:
case RECORD:
Map<String, SpecificDatumWriter<?>> writerMap = writerMaps.get();
- SpecificDatumWriter writer = writerMap.get(schema.getFullName());
- if (writer == null) {
- writer = new SpecificDatumWriter(schema);
- writerMap.put(schema.getFullName(),writer);
+ PersistentDatumWriter writer = null ;
+ // For UNION schemas, must use a specific (UNION-type-type-type)
+ // since unions don't have own name
+ if (schema.getType().equals(Schema.Type.UNION)) {
+ writer = (PersistentDatumWriter<?>) writerMap.get(String.valueOf(schema.hashCode()));
+ if (writer == null) {
+ writer = new PersistentDatumWriter(schema,false);// ignore dirty bits
+ writerMap.put(String.valueOf(schema.hashCode()),writer);
+ }
+ } else {
+ // ELSE use writer for Record
+ writer = (PersistentDatumWriter<?>) writerMap.get(schema.getFullName());
+ if (writer == null) {
+ writer = new PersistentDatumWriter(schema,false);// ignore dirty bits
+ writerMap.put(schema.getFullName(),writer);
+ }
}
BinaryEncoderWithStream encoder = encoders.get();
@@ -200,7 +229,7 @@ public class HBaseByteInterface {
ByteArrayOutputStream os = (ByteArrayOutputStream) encoder.getOut();
os.reset();
- writer.write(o, encoder);
+ writer.write(schema,o, encoder);
encoder.flush();
return os.toByteArray();
default: throw new RuntimeException("Unknown type: "+type);
Modified: gora/branches/GORA_174/gora-hbase/src/test/java/org/apache/gora/hbase/store/TestHBaseStore.java
URL: http://svn.apache.org/viewvc/gora/branches/GORA_174/gora-hbase/src/test/java/org/apache/gora/hbase/store/TestHBaseStore.java?rev=1456041&r1=1456040&r2=1456041&view=diff
==============================================================================
--- gora/branches/GORA_174/gora-hbase/src/test/java/org/apache/gora/hbase/store/TestHBaseStore.java (original)
+++ gora/branches/GORA_174/gora-hbase/src/test/java/org/apache/gora/hbase/store/TestHBaseStore.java Wed Mar 13 16:33:39 2013
@@ -97,14 +97,19 @@ public class TestHBaseStore extends Data
@Override
public void assertPutBytes(byte[] contentBytes) throws IOException {
- HTable table = new HTable("WebPage");
- Get get = new Get(Bytes.toBytes("com.example/http"));
- org.apache.hadoop.hbase.client.Result result = table.get(get);
+
+ // Since "content" is an optional field, we are forced to reopen the DataStore
+ // to retrieve the union correctly
+ webPageStore = testDriver.createDataStore(String.class, WebPage.class);
- byte[] actualBytes = result.getValue(Bytes.toBytes("content"), null);
+ WebPage page = webPageStore.get("com.example/http") ;
+ byte[] actualBytes = page.getContent().array() ;
+
+ webPageStore.close() ;
+
Assert.assertNotNull(actualBytes);
Assert.assertTrue(Arrays.equals(contentBytes, actualBytes));
- table.close();
+
}
@Override