diff --git a/ql/src/java/org/apache/hadoop/hive/ql/plan/TableScanDesc.java b/ql/src/java/org/apache/hadoop/hive/ql/plan/TableScanDesc.java index d2e22c8388..cf979623a7 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/plan/TableScanDesc.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/plan/TableScanDesc.java @@ -33,11 +33,12 @@ import java.io.Serializable; import java.util.ArrayList; -import java.util.Arrays; import java.util.BitSet; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.Optional; /** * Table Scan Descriptor Currently, data is only read from a base source as part @@ -132,13 +133,13 @@ public TableScanDesc(Table tblMetadata) { this(null, tblMetadata); } - public TableScanDesc(final String alias, Table tblMetadata) { - this(alias, null, tblMetadata); + public TableScanDesc(final String alias, final Table tblMetadata) { + this(alias, Collections.emptyList(), tblMetadata); } - public TableScanDesc(final String alias, List vcs, Table tblMetadata) { + public TableScanDesc(final String alias, final List vcs, final Table tblMetadata) { this.alias = alias; - this.virtualCols = vcs; + this.virtualCols = Objects.requireNonNull(vcs); this.tableMetadata = tblMetadata; if (tblMetadata != null) { @@ -153,8 +154,7 @@ public TableScanDesc(final String alias, List vcs, Table tblMetad @Override public Object clone() { - List vcs = new ArrayList(getVirtualCols()); - return new TableScanDesc(getAlias(), vcs, this.tableMetadata); + return new TableScanDesc(getAlias(), new ArrayList<>(getVirtualCols()), this.tableMetadata); } @Explain(displayName = "alias") @@ -167,7 +167,7 @@ public String getPredicateString() { if (filterExpr == null) { return null; } - return PlanUtils.getExprListString(Arrays.asList(filterExpr)); + return PlanUtils.getExprListString(Collections.singleton(filterExpr)); } @Explain(displayName = "table", jsonOnly = true) @@ -194,7 +194,7 @@ public boolean isTemporary() { public String getTbl() { StringBuilder sb = new StringBuilder(); sb.append(this.tableMetadata.getCompleteName()); - sb.append("," + alias); + sb.append(',').append(alias); if (AcidUtils.isFullAcidTable(tableMetadata)) { sb.append(", ACID table"); } else if (isTranscationalTable()) { @@ -226,7 +226,7 @@ public String getFilterExprString() { if (filterExpr == null) { return null; } - return PlanUtils.getExprListString(Arrays.asList(filterExpr)); + return PlanUtils.getExprListString(Collections.singleton(filterExpr)); } // @Signature // XXX @@ -326,7 +326,7 @@ public void setTmpStatsDir(String tmpStatsDir) { } public void setVirtualCols(List virtualCols) { - this.virtualCols = virtualCols; + this.virtualCols = Objects.requireNonNull(virtualCols); } public void addVirtualCols(List virtualCols) { @@ -334,7 +334,7 @@ public void addVirtualCols(List virtualCols) { } public boolean hasVirtualCols() { - return virtualCols != null && !virtualCols.isEmpty(); + return !virtualCols.isEmpty(); } public void setStatsAggPrefix(String k) { @@ -436,15 +436,8 @@ public String getIncludedBucketExplain() { return null; } - StringBuilder sb = new StringBuilder(); - sb.append("["); - for (int i = 0; i < this.includedBuckets.size(); i++) { - if (this.includedBuckets.get(i)) { - sb.append(i); - sb.append(','); - } - } - sb.append(String.format("] of %d", numBuckets)); + final StringBuilder sb = new StringBuilder(includedBuckets.toString()); + sb.append(" of ").append(numBuckets); return sb.toString(); } @@ -457,18 +450,20 @@ public void setNumBuckets(int numBuckets) { } public boolean isNeedSkipHeaderFooters() { - boolean rtn = false; + final int hcount; + final int fcount; if (tableMetadata != null && tableMetadata.getTTable() != null) { - Map params = tableMetadata.getTTable().getParameters(); - if (params != null) { - String skipHVal = params.get(serdeConstants.HEADER_COUNT); - int hcount = skipHVal == null? 0 : Integer.parseInt(skipHVal); - String skipFVal = params.get(serdeConstants.FOOTER_COUNT); - int fcount = skipFVal == null? 0 : Integer.parseInt(skipFVal); - rtn = (hcount != 0 || fcount !=0 ); - } + final Map params = + Optional.ofNullable(tableMetadata.getTTable().getParameters()).orElse(Collections.emptyMap()); + final String skipHVal = params.getOrDefault(serdeConstants.HEADER_COUNT, "0"); + final String skipFVal = params.getOrDefault(serdeConstants.FOOTER_COUNT, "0"); + hcount = Integer.parseInt(skipHVal); + fcount = Integer.parseInt(skipFVal); + } else { + hcount = 0; + fcount = 0; } - return rtn; + return (hcount != 0 || fcount != 0); } @Override public Map getOpProps() { @@ -485,15 +480,13 @@ public boolean isNeedSkipHeaderFooters() { public class TableScanOperatorExplainVectorization extends OperatorExplainVectorization { - private final TableScanDesc tableScanDesc; private final VectorTableScanDesc vectorTableScanDesc; public TableScanOperatorExplainVectorization(TableScanDesc tableScanDesc, VectorTableScanDesc vectorTableScanDesc) { // Native vectorization supported. super(vectorTableScanDesc, true); - this.tableScanDesc = tableScanDesc; - this.vectorTableScanDesc = vectorTableScanDesc; + this.vectorTableScanDesc = Objects.requireNonNull(vectorTableScanDesc); } @Explain(vectorization = Vectorization.DETAIL, displayName = "vectorizationSchemaColumns", explainLevels = { Level.DEFAULT, Level.EXTENDED })