Skip to content

Commit

Permalink
Update QualifiedName to Store the Case-sensitive QualifiedName
Browse files Browse the repository at this point in the history
  • Loading branch information
Rakesh Veeramacheneni committed Aug 1, 2019
1 parent d18c3be commit e0b003f
Show file tree
Hide file tree
Showing 2 changed files with 71 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,9 @@ public final class QualifiedName implements Serializable {
private Map<String, String> parts;
private Type type;

// Null if this QualifiedName was all lower-case to begin with.
private QualifiedName caseSensitiveQualifiedName;

private QualifiedName(
@NonNull final String catalogName,
@Nullable final String databaseName,
Expand Down Expand Up @@ -79,6 +82,10 @@ private QualifiedName(
} else {
type = Type.CATALOG;
}

this.caseSensitiveQualifiedName = createCaseSensitiveQualifiedNameIfNecessary(this.catalogName,
databaseName, this.databaseName, tableName, this.tableName, partitionName, this.partitionName,
viewName, this.viewName, this.type);
}

private QualifiedName(
Expand Down Expand Up @@ -291,6 +298,47 @@ public static QualifiedName ofTable(
return new QualifiedName(catalogName, databaseName, tableName, null, null);
}

private static QualifiedName createCaseSensitiveQualifiedNameIfNecessary(
@NonNull final String catalogName,
@Nullable final String databaseName,
@NonNull final String standardDatabaseName,
@Nullable final String tableName,
@NonNull final String standardTableName,
@Nullable final String partitionName,
@NonNull final String standardPartitionName,
@Nullable final String viewName,
@NonNull final String standardViewName,
@NonNull final Type type
) {
final String caseSensitiveDatabaseName = standardizeOptional(databaseName, false);
final String caseSensitiveTableName = standardizeOptional(tableName, false);
final String caseSensitivePartitionName = standardizeOptional(partitionName, false);
final String caseSensitiveViewName = standardizeOptional(viewName, false);
if (shouldCreateCaseSensitiveQualifiedName(caseSensitiveDatabaseName, standardDatabaseName,
caseSensitiveTableName, standardTableName, caseSensitivePartitionName, standardPartitionName,
caseSensitiveViewName, standardViewName)) {
return new QualifiedName(catalogName, caseSensitiveDatabaseName, caseSensitiveTableName,
caseSensitivePartitionName, caseSensitiveViewName, type);
}

return null;
}

private static boolean shouldCreateCaseSensitiveQualifiedName(
@NonNull final String databaseName,
@NonNull final String standardDatabaseName,
@NonNull final String tableName,
@NonNull final String standardTableName,
@NonNull final String partitionName,
@NonNull final String standardPartitionName,
@NonNull final String viewName,
@NonNull final String standardViewName) {
return !standardDatabaseName.equals(databaseName)
|| !standardTableName.equals(tableName)
|| !standardPartitionName.equals(partitionName)
|| !standardViewName.equals(viewName);
}

/**
* Creates a wild card string format of the qualified name.
*
Expand Down Expand Up @@ -436,7 +484,7 @@ public boolean isTableDefinition() {
return !tableName.isEmpty();
}

private String standardizeOptional(@Nullable final String value, final boolean forceLowerCase) {
private static String standardizeOptional(@Nullable final String value, final boolean forceLowerCase) {
if (value == null) {
return "";
} else {
Expand All @@ -448,7 +496,7 @@ private String standardizeOptional(@Nullable final String value, final boolean f
}
}

private String standardizeRequired(final String name, @Nullable final String value) {
private static String standardizeRequired(final String name, @Nullable final String value) {
if (value == null) {
throw new IllegalStateException(name + " cannot be null");
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -257,4 +257,25 @@ class QualifiedNameSpec extends Specification {
"" | "database_1" | "abcd" | "%/database_1/abcd%"
"" | "" | "abcd" | "%/%/abcd%"
}

@Unroll
def testCaseSensitiveQualifiedNameCreation() {
when:
def QualifiedName caseSensitiveQualifiedName = QualifiedName.fromString(input).getCaseSensitiveQualifiedName();

then:
(caseSensitiveQualifiedName == null) ? (result == null) : (caseSensitiveQualifiedName.toString().equals(result))

where:
input | result
'c' | null
'c/D' | 'c/D'
'c/d' | null
'c/D/T' | 'c/D/T'
'c/d/t' | null
'c/d/t/P' | 'c/d/t/P'
'c/d/t/v=1' | null
'c/d/t/V=1' | null
'c/d/t/View' | 'c/d/t/View'
}
}

0 comments on commit e0b003f

Please sign in to comment.