Skip to content

Commit

Permalink
Add BINARY type.
Browse files Browse the repository at this point in the history
  • Loading branch information
kimballa committed May 10, 2011
1 parent 790e7ba commit 5eacffa
Show file tree
Hide file tree
Showing 6 changed files with 29 additions and 0 deletions.
2 changes: 2 additions & 0 deletions TODO
Expand Up @@ -21,6 +21,8 @@ Types:

-- need List<T>, Map<T1, T2> types

-- BINARY type should be able to specify encoding when converting to STRING.

Aggregation:

-- unit test, unit test, unit test, baby.
Expand Down
1 change: 1 addition & 0 deletions src/main/antlr3/com/odiago/flumebase/parser/SqlGrammar.g
Expand Up @@ -247,6 +247,7 @@ primitive_field_type returns [String val]:
| FLOAT { $val = "FLOAT"; }
| DOUBLE { $val = "DOUBLE"; }
| STRING_KW { $val = "STRING"; }
| BINARY { $val = "BINARY"; }
| TIMESTAMP { $val = "TIMESTAMP"; };
// Defines a PRECISE(n) type.
Expand Down
1 change: 1 addition & 0 deletions src/main/antlr3/com/odiago/flumebase/parser/SqlLexer.g
Expand Up @@ -30,6 +30,7 @@ L_AND : A N D ;
AS : A S ;
BETWEEN : B E T W E E N ;
BIGINT : B I G I N T ;
BINARY : B I N A R Y ;
BOOLEAN : B O O L E A N ;
BY : B Y ;
CREATE : C R E A T E ;
Expand Down
Expand Up @@ -121,6 +121,9 @@ protected Object parseAndCache(CharBuffer chars, int colIdx, Type expectedType)
// TODO(aaron): Test how this handles a field that is an empty string.
Object out = null;
switch (primitiveTypeName) {
case BINARY:
out = /* TODO: BASE64-decode the chars */ bla bla bla;
break;
case BOOLEAN:
out = CharBufferUtils.parseBool(chars);
break;
Expand Down
9 changes: 9 additions & 0 deletions src/main/java/com/odiago/flumebase/lang/Type.java
Expand Up @@ -50,6 +50,7 @@ public enum TypeName implements Comparable<TypeName> {
PRECISE(5), // A numeric type which allows the user to specify an arbitrary
// degree of precision.
STRING(8),
BINARY(6),
TIMESTAMP(6),
TIMESPAN(7),
ANY(0), // 'null' constant can be cast to any type. Only valid inside NULLABLE.
Expand Down Expand Up @@ -140,6 +141,7 @@ protected Type(TypeName name) {
PRIMITIVE_TYPES.put(TypeName.FLOAT, new Type(TypeName.FLOAT));
PRIMITIVE_TYPES.put(TypeName.DOUBLE, new Type(TypeName.DOUBLE));
PRIMITIVE_TYPES.put(TypeName.STRING, new Type(TypeName.STRING));
PRIMITIVE_TYPES.put(TypeName.BINARY, new Type(TypeName.BINARY));
PRIMITIVE_TYPES.put(TypeName.TIMESTAMP, new Type(TypeName.TIMESTAMP));
PRIMITIVE_TYPES.put(TypeName.TIMESPAN, new Type(TypeName.TIMESPAN));
PRIMITIVE_TYPES.put(TypeName.TYPECLASS_NUMERIC, new Type(TypeName.TYPECLASS_NUMERIC));
Expand All @@ -156,6 +158,7 @@ protected Type(TypeName name) {
NULLABLE_TYPES.put(TypeName.FLOAT, new NullableType(TypeName.FLOAT));
NULLABLE_TYPES.put(TypeName.DOUBLE, new NullableType(TypeName.DOUBLE));
NULLABLE_TYPES.put(TypeName.STRING, new NullableType(TypeName.STRING));
NULLABLE_TYPES.put(TypeName.BINARY, new NullableType(TypeName.BINARY));
NULLABLE_TYPES.put(TypeName.TIMESTAMP, new NullableType(TypeName.TIMESTAMP));
NULLABLE_TYPES.put(TypeName.TIMESPAN, new NullableType(TypeName.TIMESPAN));
NULLABLE_TYPES.put(TypeName.ANY, new NullableType(TypeName.ANY));
Expand Down Expand Up @@ -253,6 +256,7 @@ public boolean isScalar() {
case DOUBLE:
case PRECISE:
case STRING:
case BINARY:
case TIMESTAMP:
case TIMESPAN:
case WINDOW:
Expand All @@ -268,6 +272,7 @@ public boolean isScalar() {
public boolean isComparable() {
return isNumeric() || this.equals(Type.getPrimitive(TypeName.BOOLEAN))
|| this.equals(Type.getPrimitive(TypeName.STRING))
|| this.equals(Type.getPrimitive(TypeName.BINARY))
|| this.equals(Type.getPrimitive(TypeName.TYPECLASS_COMPARABLE));
}

Expand Down Expand Up @@ -323,6 +328,8 @@ public Schema getAvroSchema() {
* with the exception of "WINDOW".)
*
*</tt></pre></li>
* <li>The lattice ANY -&gt; BINARY -&gt; STRING -&gt; ... also holds.
* Bytes are BASE64-encoded when converted to strings.</li>
* <li>An additional rule governs meets over PRECISE(k) types:
* meet(PRECISE(n), PRECISE(m)) = PRECISE(MAX(n, m))</li>
* <li>The following lattice describes TYPECLASS_COMPARABLE and TYPECLASS_ANY:<pre><tt>
Expand Down Expand Up @@ -563,6 +570,8 @@ protected Schema getAvroSchema(TypeName typeName) {
return Schema.create(Schema.Type.DOUBLE);
case STRING:
return Schema.create(Schema.Type.STRING);
case BINARY:
return Schema.create(Schema.Type.BYTES);
case TIMESPAN:
return TimeSpan.SCHEMA$;
case TIMESTAMP:
Expand Down
13 changes: 13 additions & 0 deletions src/test/java/com/odiago/flumebase/lang/TestType.java
Expand Up @@ -75,6 +75,19 @@ public void testPromotion() {
Type.getNullable(Type.TypeName.FLOAT)));
assertTrue(Type.getPrimitive(Type.TypeName.INT).promotesTo(
Type.getNullable(Type.TypeName.STRING)));

// BINARY type
assertTrue(Type.getPrimitive(Type.TypeName.BINARY).promotesTo(
Type.getNullable(Type.TypeName.BINARY)));
assertTrue(Type.getPrimitive(Type.TypeName.BINARY).promotesTo(
Type.getNullable(Type.TypeName.STRING)));

assertFalse(Type.getPrimitive(Type.TypeName.BINARY).promotesTo(
Type.getPrimitive(Type.TypeName.INT)));
assertFalse(Type.getPrimitive(Type.TypeName.INT).promotesTo(
Type.getPrimitive(Type.TypeName.BINARY)));
assertFalse(Type.getPrimitive(Type.TypeName.BINARY).promotesTo(
Type.getNullable(Type.TypeName.INT)));

// STRING to NULLABLE(STRING).
assertTrue(Type.getPrimitive(Type.TypeName.STRING).promotesTo(
Expand Down

0 comments on commit 5eacffa

Please sign in to comment.