/** * Return whether this name refers to an array. The path must be an array if it * ends with an array index; else it may or may not be an entire array. * * @return true if the path ends with an array index, false otherwise */ public boolean isArray() { PathSegment seg = rootSegment; while (seg != null) { if (seg.isArray()) { return true; } seg = seg.getChild(); } return false; }
/** * A simple is a path where there are no repeated elements outside the lowest level of the path. * @return Whether this path is a simple path. */ public boolean isSimplePath() { PathSegment seg = rootSegment; while (seg != null) { if (seg.isArray() && !seg.isLastPath()) { return false; } seg = seg.getChild(); } return true; }
private static FieldPath getFieldPathForProjection(SchemaPath column) { Stack<PathSegment.NameSegment> pathSegments = new Stack<>(); PathSegment seg = column.getRootSegment(); while (seg != null && seg.isNamed()) { pathSegments.push((PathSegment.NameSegment) seg); seg = seg.getChild(); } FieldSegment.NameSegment child = null; while (!pathSegments.isEmpty()) { child = new FieldSegment.NameSegment(pathSegments.pop().getPath(), child, false); } return new FieldPath(child); }
@Override public Void visitSchemaPath(SchemaPath path, StringBuilder sb) throws RuntimeException { PathSegment seg = path.getRootSegment(); if (seg.isArray()) { throw new IllegalStateException("Drill doesn't currently support top level arrays"); } sb.append('`'); sb.append(escapeBackTick(seg.getNameSegment().getPath())); sb.append('`'); while ( (seg = seg.getChild()) != null) { if (seg.isNamed()) { sb.append('.'); sb.append('`'); sb.append(escapeBackTick(seg.getNameSegment().getPath())); sb.append('`'); } else { sb.append('['); sb.append(seg.getArraySegment().getIndex()); sb.append(']'); } } return null; }
/** * Returns {@link FieldPath} equivalent of the specified {@link SchemaPath}. */ public static FieldPath schemaPath2FieldPath(SchemaPath column) { Stack<PathSegment> pathSegments = new Stack<PathSegment>(); PathSegment seg = column.getRootSegment(); while (seg != null) { pathSegments.push(seg); seg = seg.getChild(); } FieldSegment child = null; while (!pathSegments.isEmpty()) { seg = pathSegments.pop(); if (seg.isNamed()) { child = new FieldSegment.NameSegment(((PathSegment.NameSegment)seg).getPath(), child, false); } else { child = new FieldSegment.IndexSegment(((PathSegment.ArraySegment)seg).getIndex(), child); } } return new FieldPath((FieldSegment.NameSegment) child); }
/** * Returns {@link FieldPath} equivalent of the specified {@link SchemaPath}. * * @param schemaPath {@link SchemaPath} instance that should be converted * @return {@link FieldPath} equivalent of the specified {@link SchemaPath}. */ public static FieldPath schemaPathToFieldPath(SchemaPath schemaPath) { Deque<PathSegment> pathSegments = Queues.newArrayDeque(); PathSegment pathSegment = schemaPath.getRootSegment(); while (pathSegment != null) { pathSegments.push(pathSegment); pathSegment = pathSegment.getChild(); } FieldSegment child = null; while (!pathSegments.isEmpty()) { pathSegment = pathSegments.pop(); if (pathSegment.isNamed()) { child = new FieldSegment.NameSegment(((PathSegment.NameSegment) pathSegment).getPath(), child, false); } else { child = new FieldSegment.IndexSegment(String.valueOf(((PathSegment.ArraySegment) pathSegment).getIndex()), child); } } return new FieldPath((FieldSegment.NameSegment) child); } }
private static NamePart getNamePart(PathSegment s) { if (s == null) { return null; } NamePart.Builder b = NamePart.newBuilder(); if (s.getChild() != null) { NamePart namePart = getNamePart(s.getChild()); if (namePart != null) { b.setChild(namePart); } } if (s.isArray()) { if (s.getArraySegment().hasIndex()) { throw new IllegalStateException("You cannot convert a indexed schema path to a NamePart. NameParts can only reference Vectors, not individual records or values."); } b.setType(Type.ARRAY); } else { b.setType(Type.NAME); b.setName(s.getNameSegment().getPath()); } return b.build(); }
/** * Traverses path segment to extract named segments, omits all other segments (i.e. array). * Order of named segments appearance will be preserved. * * @param currentSegment current segment * @param resultingSegment resulting segment * @return named segment */ private NameSegment getUnIndexedNameSegment(PathSegment currentSegment, NameSegment resultingSegment) { if (!currentSegment.isLastPath()) { resultingSegment = getUnIndexedNameSegment(currentSegment.getChild(), resultingSegment); } if (currentSegment.isNamed()) { String path = currentSegment.getNameSegment().getPath(); return new NameSegment(path, resultingSegment); } return resultingSegment; }
/** * Return whether this name refers to an array. The path must be an array if it * ends with an array index; else it may or may not be an entire array. * * @return true if the path ends with an array index, false otherwise */ public boolean isArray() { PathSegment seg = rootSegment; while (seg != null) { if (seg.isArray()) { return true; } seg = seg.getChild(); } return false; }
/** * A simple is a path where there are no repeated elements outside the lowest level of the path. * @return Whether this path is a simple path. */ public boolean isSimplePath() { PathSegment seg = rootSegment; while (seg != null) { if (seg.isArray() && !seg.isLastPath()) { return false; } seg = seg.getChild(); } return true; }
private static FieldPath getFieldPathForProjection(SchemaPath column) { Stack<PathSegment.NameSegment> pathSegments = new Stack<>(); PathSegment seg = column.getRootSegment(); while (seg != null && seg.isNamed()) { pathSegments.push((PathSegment.NameSegment) seg); seg = seg.getChild(); } FieldSegment.NameSegment child = null; while (!pathSegments.isEmpty()) { child = new FieldSegment.NameSegment(pathSegments.pop().getPath(), child, false); } return new FieldPath(child); }
private boolean isNullReaderLikely(PathSegment seg, boolean complexOrRepeated) { while (seg != null) { if (seg.isArray() && !seg.isLastPath()) { return true; } if (seg.isLastPath() && complexOrRepeated) { return true; } seg = seg.getChild(); } return false; }
public void ensureAtLeastOneField(ComplexWriter writer) { if (!atLeastOneWrite) { // if we had no columns, create one empty one so we can return some data // for count purposes. SchemaPath sp = columns.get(0); PathSegment root = sp.getRootSegment(); BaseWriter.MapWriter fieldWriter = writer.rootAsMap(); while (root.getChild() != null && !root.getChild().isArray()) { fieldWriter = fieldWriter.map(root.getNameSegment().getPath()); root = root.getChild(); } fieldWriter.integer(root.getNameSegment().getPath()); } }
@Override public Void visitSchemaPath(SchemaPath path, StringBuilder sb) throws RuntimeException { PathSegment seg = path.getRootSegment(); if (seg.isArray()) { throw new IllegalStateException("Drill doesn't currently support top level arrays"); } sb.append('`'); sb.append(escapeBackTick(seg.getNameSegment().getPath())); sb.append('`'); while ( (seg = seg.getChild()) != null) { if (seg.isNamed()) { sb.append('.'); sb.append('`'); sb.append(escapeBackTick(seg.getNameSegment().getPath())); sb.append('`'); } else { sb.append('['); sb.append(seg.getArraySegment().getIndex()); sb.append(']'); } } return null; }
@Override public void parseSegment(PathSegment pathSeg) { if (pathSeg.isLastPath()) { parseLeaf((NameSegment) pathSeg); } else if (pathSeg.getChild().isArray()) { parseArray((NameSegment) pathSeg); } else { parseInternal((NameSegment) pathSeg); } }
/** * Traverses path segment to extract named segments, omits all other segments (i.e. array). * Order of named segments appearance will be preserved. * * @param currentSegment current segment * @param resultingSegment resulting segment * @return named segment */ private NameSegment getUnIndexedNameSegment(PathSegment currentSegment, NameSegment resultingSegment) { if (!currentSegment.isLastPath()) { resultingSegment = getUnIndexedNameSegment(currentSegment.getChild(), resultingSegment); } if (currentSegment.isNamed()) { String path = currentSegment.getNameSegment().getPath(); return new NameSegment(path, resultingSegment); } return resultingSegment; }
private void add(PathSegment segment){ if(segment.isNamed()){ boolean lastPath = segment.isLastPath(); FieldSelection child = addChild(segment.getNameSegment().getPath()); if (lastPath) { child.setAlwaysValid(); } if (!lastPath && !child.isAlwaysValid()) { child.add(segment.getChild()); } } }