aboutsummaryrefslogtreecommitdiff
path: root/exec/java-exec/src/main/java/org/apache/drill/exec/record/metadata/schema/parser/SchemaVisitor.java
diff options
context:
space:
mode:
Diffstat (limited to 'exec/java-exec/src/main/java/org/apache/drill/exec/record/metadata/schema/parser/SchemaVisitor.java')
-rw-r--r--exec/java-exec/src/main/java/org/apache/drill/exec/record/metadata/schema/parser/SchemaVisitor.java66
1 files changed, 60 insertions, 6 deletions
diff --git a/exec/java-exec/src/main/java/org/apache/drill/exec/record/metadata/schema/parser/SchemaVisitor.java b/exec/java-exec/src/main/java/org/apache/drill/exec/record/metadata/schema/parser/SchemaVisitor.java
index 7c7663a71..c49007b65 100644
--- a/exec/java-exec/src/main/java/org/apache/drill/exec/record/metadata/schema/parser/SchemaVisitor.java
+++ b/exec/java-exec/src/main/java/org/apache/drill/exec/record/metadata/schema/parser/SchemaVisitor.java
@@ -27,8 +27,12 @@ import org.apache.drill.exec.record.metadata.MetadataUtils;
import org.apache.drill.exec.record.metadata.RepeatedListBuilder;
import org.apache.drill.exec.record.metadata.TupleMetadata;
import org.apache.drill.exec.record.metadata.TupleSchema;
+import org.apache.drill.shaded.guava.com.google.common.base.Preconditions;
+import java.util.LinkedHashMap;
import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
/**
* Visits schema and stores metadata about its columns into {@link TupleMetadata} class.
@@ -43,14 +47,42 @@ public class SchemaVisitor extends SchemaParserBaseVisitor<TupleMetadata> {
@Override
public TupleMetadata visitColumns(SchemaParser.ColumnsContext ctx) {
TupleMetadata schema = new TupleSchema();
- ColumnVisitor columnVisitor = new ColumnVisitor();
- ctx.column().forEach(
- c -> schema.addColumn(c.accept(columnVisitor))
+ ColumnDefVisitor columnDefVisitor = new ColumnDefVisitor();
+ ctx.column_def().forEach(
+ columnDef -> schema.addColumn(columnDef.accept(columnDefVisitor))
);
return schema;
}
/**
+ * Visits column definition, adds column properties to {@link ColumnMetadata} if present.
+ */
+ public static class ColumnDefVisitor extends SchemaParserBaseVisitor<ColumnMetadata> {
+
+ @Override
+ public ColumnMetadata visitColumn_def(SchemaParser.Column_defContext ctx) {
+ ColumnVisitor columnVisitor = new ColumnVisitor();
+ ColumnMetadata columnMetadata = ctx.column().accept(columnVisitor);
+ if (ctx.property_values() != null) {
+ StringValueVisitor stringValueVisitor = new StringValueVisitor();
+ Map<String, String> columnProperties = new LinkedHashMap<>();
+ ctx.property_values().property_pair().forEach(
+ pair -> {
+ List<String> pairValues = pair.string_value().stream()
+ .map(stringValueVisitor::visit)
+ .collect(Collectors.toList());
+ Preconditions.checkState(pairValues.size() == 2);
+ columnProperties.put(pairValues.get(0), pairValues.get(1));
+ }
+ );
+ columnMetadata.setProperties(columnProperties);
+ }
+ return columnMetadata;
+ }
+
+ }
+
+ /**
* Visits various types of columns (primitive, map, array) and stores their metadata
* into {@link ColumnMetadata} class.
*/
@@ -60,7 +92,15 @@ public class SchemaVisitor extends SchemaParserBaseVisitor<TupleMetadata> {
public ColumnMetadata visitPrimitive_column(SchemaParser.Primitive_columnContext ctx) {
String name = ctx.column_id().accept(new IdVisitor());
TypeProtos.DataMode mode = ctx.nullability() == null ? TypeProtos.DataMode.OPTIONAL : TypeProtos.DataMode.REQUIRED;
- return ctx.simple_type().accept(new TypeVisitor(name, mode));
+ ColumnMetadata columnMetadata = ctx.simple_type().accept(new TypeVisitor(name, mode));
+ StringValueVisitor stringValueVisitor = new StringValueVisitor();
+ if (ctx.format_value() != null) {
+ columnMetadata.setFormatValue(stringValueVisitor.visit(ctx.format_value().string_value()));
+ }
+ if (ctx.default_value() != null) {
+ columnMetadata.setDefaultFromString(stringValueVisitor.visit(ctx.default_value().string_value()));
+ }
+ return columnMetadata;
}
@Override
@@ -88,6 +128,20 @@ public class SchemaVisitor extends SchemaParserBaseVisitor<TupleMetadata> {
}
/**
+ * Visits quoted string, strips backticks, single quotes or double quotes and returns bare string value.
+ */
+ private static class StringValueVisitor extends SchemaParserBaseVisitor<String> {
+
+ @Override
+ public String visitString_value(SchemaParser.String_valueContext ctx) {
+ String text = ctx.getText();
+ // first substring first and last symbols (backticks, single quotes, double quotes)
+ // then find all chars that are preceding with the backslash and remove the backslash
+ return text.substring(1, text.length() -1).replaceAll("\\\\(.)", "$1");
+ }
+ }
+
+ /**
* Visits ID and QUOTED_ID, returning their string representation.
*/
private static class IdVisitor extends SchemaParserBaseVisitor<String> {
@@ -225,8 +279,8 @@ public class SchemaVisitor extends SchemaParserBaseVisitor<TupleMetadata> {
@Override
public ColumnMetadata visitMap_type(SchemaParser.Map_typeContext ctx) {
MapBuilder builder = new MapBuilder(null, name, mode);
- ColumnVisitor visitor = new ColumnVisitor();
- ctx.columns().column().forEach(
+ ColumnDefVisitor visitor = new ColumnDefVisitor();
+ ctx.columns().column_def().forEach(
c -> builder.addColumn(c.accept(visitor))
);
return builder.buildColumn();