Skip to content

Commit 254f94c

Browse files
#100: added new Exasol data type HASHTYPE (#112)
* #100: added new Exasol data type HASHTYPE
1 parent 9d1dc24 commit 254f94c

File tree

9 files changed

+135
-123
lines changed

9 files changed

+135
-123
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<modelVersion>4.0.0</modelVersion>
55
<groupId>com.exasol</groupId>
66
<artifactId>virtual-schema-common-java</artifactId>
7-
<version>7.3.0</version>
7+
<version>7.4.0</version>
88
<name>Common module of Exasol Virtual Schemas Adapters</name>
99
<description>This is one of the modules of Virtual Schemas Adapters. The libraries provided by this project are the foundation of the adapter development, i.e. adapters must be implemented on top of them.</description>
1010
<url>https://github.com/exasol/virtual-schema-common-java</url>

src/main/java/com/exasol/adapter/metadata/DataType.java

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,10 @@ public class DataType {
1919
private int geometrySrid;
2020
private IntervalType intervalType;
2121
private int intervalFraction;
22+
private int byteSize;
2223

2324
public enum ExaDataType {
24-
UNSUPPORTED, DECIMAL, DOUBLE, VARCHAR, CHAR, DATE, TIMESTAMP, BOOLEAN, GEOMETRY, INTERVAL
25+
UNSUPPORTED, DECIMAL, DOUBLE, VARCHAR, CHAR, DATE, TIMESTAMP, BOOLEAN, GEOMETRY, INTERVAL, HASHTYPE
2526
}
2627

2728
public enum ExaCharset {
@@ -208,6 +209,19 @@ public static DataType createIntervalYearMonth(final int precision) {
208209
return type;
209210
}
210211

212+
/**
213+
* Create a <code>HASHTYPE</code> data type
214+
*
215+
* @param byteSize size in bytes
216+
* @return <code>HASHTYPE</code> data type
217+
*/
218+
public static DataType createHashtype(final int byteSize) {
219+
final DataType type = new DataType();
220+
type.exaDataType = ExaDataType.HASHTYPE;
221+
type.byteSize = byteSize;
222+
return type;
223+
}
224+
211225
/**
212226
* Get the Exasol data type without parameters
213227
*
@@ -291,6 +305,15 @@ public int getIntervalFraction() {
291305
return this.intervalFraction;
292306
}
293307

308+
/**
309+
* Get the size in bytes.
310+
*
311+
* @return byte size
312+
*/
313+
public int getByteSize() {
314+
return this.byteSize;
315+
}
316+
294317
/**
295318
* Check if the data type is supported.
296319
*
@@ -334,10 +357,20 @@ public String toString() {
334357
case INTERVAL:
335358
appendInterval(builder);
336359
break;
360+
case HASHTYPE:
361+
appendHashtype(builder);
337362
}
338363
return builder.toString();
339364
}
340365

366+
private void appendHashtype(final StringBuilder builder) {
367+
builder.append("HASHTYPE");
368+
builder.append("(");
369+
builder.append(this.byteSize);
370+
builder.append(" byte");
371+
builder.append(")");
372+
}
373+
341374
private void appendInterval(final StringBuilder builder) {
342375
builder.append("INTERVAL ");
343376
if (this.intervalType == IntervalType.YEAR_TO_MONTH) {
@@ -405,12 +438,12 @@ public boolean equals(final Object o) {
405438
&& (this.withLocalTimezone == dataType.withLocalTimezone)
406439
&& (this.geometrySrid == dataType.geometrySrid) && (this.intervalFraction == dataType.intervalFraction)
407440
&& (this.exaDataType == dataType.exaDataType) && (this.charset == dataType.charset)
408-
&& (this.intervalType == dataType.intervalType);
441+
&& (this.intervalType == dataType.intervalType) && (this.byteSize == dataType.byteSize);
409442
}
410443

411444
@Override
412445
public int hashCode() {
413446
return Objects.hash(this.exaDataType, this.precision, this.scale, this.size, this.charset,
414-
this.withLocalTimezone, this.geometrySrid, this.intervalType, this.intervalFraction);
447+
this.withLocalTimezone, this.geometrySrid, this.intervalType, this.intervalFraction, this.byteSize);
415448
}
416449
}

src/main/java/com/exasol/adapter/metadata/converter/SchemaMetadataJsonConverter.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,6 +127,9 @@ public JsonObject convertType(final DataType dataType) {
127127
case INTERVAL:
128128
addIntervalToRoot(dataType, typeAsJson);
129129
break;
130+
case HASHTYPE:
131+
typeAsJson.add("bytesize", dataType.getByteSize());
132+
break;
130133
case DOUBLE: // falling through intentionally
131134
case DATE:
132135
case BOOLEAN:
@@ -168,6 +171,8 @@ private String getExasolDataTypeName(final ExaDataType dataType) {
168171
return "geometry";
169172
case INTERVAL:
170173
return "interval";
174+
case HASHTYPE:
175+
return "hashtype";
171176
default:
172177
return "unknown";
173178
}

src/main/java/com/exasol/adapter/request/parser/PushdownSqlParser.java

Lines changed: 52 additions & 98 deletions
Original file line numberDiff line numberDiff line change
@@ -31,108 +31,74 @@ private PushdownSqlParser(final List<TableMetadata> involvedTablesMetadata) {
3131
public SqlNode parseExpression(final JsonObject expression) {
3232
final String typeName = expression.getString("type", "");
3333
final SqlNodeType type = fromTypeName(typeName);
34-
final SqlNode sqlNode;
3534
switch (type) {
3635
case SELECT:
37-
sqlNode = parseSelect(expression);
38-
break;
36+
return parseSelect(expression);
3937
case TABLE:
40-
sqlNode = parseTable(expression);
41-
break;
38+
return parseTable(expression);
4239
case JOIN:
43-
sqlNode = parseJoin(expression);
44-
break;
40+
return parseJoin(expression);
4541
case COLUMN:
46-
sqlNode = parseColumn(expression);
47-
break;
42+
return parseColumn(expression);
4843
case LITERAL_NULL:
49-
sqlNode = parseLiteralNull();
50-
break;
44+
return parseLiteralNull();
5145
case LITERAL_BOOL:
52-
sqlNode = parseLiteralBool(expression);
53-
break;
46+
return parseLiteralBool(expression);
5447
case LITERAL_DATE:
55-
sqlNode = parseLiteralDate(expression);
56-
break;
48+
return parseLiteralDate(expression);
5749
case LITERAL_TIMESTAMP:
58-
sqlNode = parseLiteralTimestamp(expression);
59-
break;
50+
return parseLiteralTimestamp(expression);
6051
case LITERAL_TIMESTAMPUTC:
61-
sqlNode = parseLiteralTimestamputc(expression);
62-
break;
52+
return parseLiteralTimestamputc(expression);
6353
case LITERAL_DOUBLE:
64-
sqlNode = parseLiteralDouble(expression);
65-
break;
54+
return parseLiteralDouble(expression);
6655
case LITERAL_EXACTNUMERIC:
67-
sqlNode = parseLiteralExactNumeric(expression);
68-
break;
56+
return parseLiteralExactNumeric(expression);
6957
case LITERAL_STRING:
70-
sqlNode = parseLiteralString(expression);
71-
break;
58+
return parseLiteralString(expression);
7259
case LITERAL_INTERVAL:
73-
sqlNode = parseLiteralInterval(expression);
74-
break;
60+
return parseLiteralInterval(expression);
7561
case PREDICATE_AND:
76-
sqlNode = parsePredicateAnd(expression);
77-
break;
62+
return parsePredicateAnd(expression);
7863
case PREDICATE_OR:
79-
sqlNode = parsePredicateOr(expression);
80-
break;
64+
return parsePredicateOr(expression);
8165
case PREDICATE_NOT:
82-
sqlNode = parsePredicateNot(expression);
83-
break;
66+
return parsePredicateNot(expression);
8467
case PREDICATE_EQUAL:
85-
sqlNode = parsePredicateEqual(expression);
86-
break;
68+
return parsePredicateEqual(expression);
8769
case PREDICATE_NOTEQUAL:
88-
sqlNode = parsePredicateNotEqual(expression);
89-
break;
70+
return parsePredicateNotEqual(expression);
9071
case PREDICATE_LESS:
91-
sqlNode = parsePredicateLess(expression);
92-
break;
72+
return parsePredicateLess(expression);
9373
case PREDICATE_LESSEQUAL:
94-
sqlNode = parsePredicateLessEqual(expression);
95-
break;
74+
return parsePredicateLessEqual(expression);
9675
case PREDICATE_LIKE:
97-
sqlNode = parsePredicateLike(expression);
98-
break;
76+
return parsePredicateLike(expression);
9977
case PREDICATE_LIKE_REGEXP:
100-
sqlNode = parsePredicateLikeRegexp(expression);
101-
break;
78+
return parsePredicateLikeRegexp(expression);
10279
case PREDICATE_BETWEEN:
103-
sqlNode = parsePredicateBetween(expression);
104-
break;
80+
return parsePredicateBetween(expression);
10581
case PREDICATE_IN_CONSTLIST:
106-
sqlNode = parsePredicateInConstlist(expression);
107-
break;
82+
return parsePredicateInConstlist(expression);
10883
case PREDICATE_IS_NULL:
109-
sqlNode = parsePredicateIsNull(expression);
110-
break;
84+
return parsePredicateIsNull(expression);
11185
case PREDICATE_IS_NOT_NULL:
112-
sqlNode = parsePredicateIsNotNull(expression);
113-
break;
86+
return parsePredicateIsNotNull(expression);
11487
case FUNCTION_SCALAR:
115-
sqlNode = parseFunctionScalar(expression);
116-
break;
88+
return parseFunctionScalar(expression);
11789
case FUNCTION_SCALAR_EXTRACT:
118-
sqlNode = parseFunctionScalarExtract(expression);
119-
break;
90+
return parseFunctionScalarExtract(expression);
12091
case FUNCTION_SCALAR_CASE:
121-
sqlNode = parseFunctionScalarCase(expression);
122-
break;
92+
return parseFunctionScalarCase(expression);
12393
case FUNCTION_SCALAR_CAST:
124-
sqlNode = parseFunctionScalarCast(expression);
125-
break;
94+
return parseFunctionScalarCast(expression);
12695
case FUNCTION_AGGREGATE:
127-
sqlNode = parseFunctionAggregate(expression);
128-
break;
96+
return parseFunctionAggregate(expression);
12997
case FUNCTION_AGGREGATE_GROUP_CONCAT:
130-
sqlNode = parseFunctionAggregateGroupConcat(expression);
131-
break;
98+
return parseFunctionAggregateGroupConcat(expression);
13299
default:
133100
throw new IllegalArgumentException("Unknown node type: " + typeName);
134101
}
135-
return sqlNode;
136102
}
137103

138104
private SqlStatementSelect parseSelect(final JsonObject select) {
@@ -335,60 +301,50 @@ private SqlNode parseLiteralInterval(final JsonObject expression) {
335301

336302
private DataType getDataType(final JsonObject dataType) {
337303
final String typeName = dataType.getString("type").toUpperCase();
338-
final DataType type;
339304
switch (typeName) {
340305
case "DECIMAL":
341-
type = DataType.createDecimal(dataType.getInt("precision"), dataType.getInt("scale"));
342-
break;
306+
return DataType.createDecimal(dataType.getInt("precision"), dataType.getInt("scale"));
343307
case "DOUBLE":
344-
type = DataType.createDouble();
345-
break;
308+
return DataType.createDouble();
346309
case "VARCHAR":
347-
type = getVarchar(dataType);
348-
break;
310+
return getVarchar(dataType);
349311
case "CHAR":
350-
type = getChar(dataType);
351-
break;
312+
return getChar(dataType);
352313
case "BOOLEAN":
353-
type = DataType.createBool();
354-
break;
314+
return DataType.createBool();
355315
case "DATE":
356-
type = DataType.createDate();
357-
break;
316+
return DataType.createDate();
358317
case "TIMESTAMP":
359-
type = getTimestamp(dataType);
360-
break;
318+
return getTimestamp(dataType);
361319
case "INTERVAL":
362-
type = getInterval(dataType);
363-
break;
320+
return getInterval(dataType);
364321
case "GEOMETRY":
365-
type = getGeometry(dataType);
366-
break;
322+
return getGeometry(dataType);
323+
case "HASHTYPE":
324+
return getHashtype(dataType);
367325
default:
368326
throw new IllegalArgumentException("Unsupported data type encountered: " + typeName);
369327
}
370-
return type;
328+
}
329+
330+
private DataType getHashtype(final JsonObject dataType) {
331+
final int byteSize = dataType.getInt("bytesize");
332+
return DataType.createGeometry(byteSize);
371333
}
372334

373335
private DataType getVarchar(final JsonObject dataType) {
374-
final DataType type;
375336
final String charSet = dataType.getString("characterSet", "UTF8");
376-
type = DataType.createVarChar(dataType.getInt("size"), charSetFromString(charSet));
377-
return type;
337+
return DataType.createVarChar(dataType.getInt("size"), charSetFromString(charSet));
378338
}
379339

380340
private DataType getChar(final JsonObject dataType) {
381-
final DataType type;
382341
final String charSet = dataType.getString("characterSet", "UTF8");
383-
type = DataType.createChar(dataType.getInt("size"), charSetFromString(charSet));
384-
return type;
342+
return DataType.createChar(dataType.getInt("size"), charSetFromString(charSet));
385343
}
386344

387345
private DataType getTimestamp(final JsonObject dataType) {
388-
final DataType type;
389346
final boolean withLocalTimezone = dataType.getBoolean("withLocalTimeZone", false);
390-
type = DataType.createTimestamp(withLocalTimezone);
391-
return type;
347+
return DataType.createTimestamp(withLocalTimezone);
392348
}
393349

394350
private DataType getInterval(final JsonObject dataType) {
@@ -406,10 +362,8 @@ private DataType getInterval(final JsonObject dataType) {
406362
}
407363

408364
private DataType getGeometry(final JsonObject dataType) {
409-
final DataType type;
410365
final int srid = dataType.getInt("srid");
411-
type = DataType.createGeometry(srid);
412-
return type;
366+
return DataType.createGeometry(srid);
413367
}
414368

415369
private static ExaCharset charSetFromString(final String charset) {

0 commit comments

Comments
 (0)