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
