@@ -28,77 +28,74 @@ trait Catalog {
28
28
29
29
def caseSensitive : Boolean
30
30
31
- def tableExists (db : Option [String ], tableName : String ): Boolean
31
+ def tableExists (tableIdentifier : Seq [String ]): Boolean
32
32
33
33
def lookupRelation (
34
- databaseName : Option [String ],
35
- tableName : String ,
36
- alias : Option [String ] = None ): LogicalPlan
34
+ tableIdentifier : Seq [String ],
35
+ alias : Option [String ] = None ): LogicalPlan
37
36
38
- def registerTable (databaseName : Option [String ], tableName : String , plan : LogicalPlan ): Unit
37
+ def registerTable (tableIdentifier : Seq [String ], plan : LogicalPlan ): Unit
39
38
40
- def unregisterTable (databaseName : Option [String ], tableName : String ): Unit
39
+ def unregisterTable (tableIdentifier : Seq [String ]): Unit
41
40
42
41
def unregisterAllTables (): Unit
43
42
44
- protected def processDatabaseAndTableName (
45
- databaseName : Option [String ],
46
- tableName : String ): (Option [String ], String ) = {
43
+ protected def processTableIdentifier (tableIdentifier : Seq [String ]): Seq [String ] = {
47
44
if (! caseSensitive) {
48
- (databaseName .map(_.toLowerCase), tableName .toLowerCase)
45
+ tableIdentifier .map(_.toLowerCase)
49
46
} else {
50
- (databaseName, tableName)
47
+ tableIdentifier
51
48
}
52
49
}
53
50
54
- protected def processDatabaseAndTableName (
55
- databaseName : String ,
56
- tableName : String ): (String , String ) = {
57
- if (! caseSensitive) {
58
- (databaseName.toLowerCase, tableName.toLowerCase)
51
+ protected def getDbTableName (tableIdent : Seq [String ]): String = {
52
+ val size = tableIdent.size
53
+ if (size <= 2 ) {
54
+ tableIdent.mkString(" ." )
59
55
} else {
60
- (databaseName, tableName )
56
+ tableIdent.slice(size - 2 , size).mkString( " . " )
61
57
}
62
58
}
59
+
60
+ protected def getDBTable (tableIdent : Seq [String ]) : (Option [String ], String ) = {
61
+ (tableIdent.lift(tableIdent.size - 2 ), tableIdent.last)
62
+ }
63
63
}
64
64
65
65
class SimpleCatalog (val caseSensitive : Boolean ) extends Catalog {
66
66
val tables = new mutable.HashMap [String , LogicalPlan ]()
67
67
68
68
override def registerTable (
69
- databaseName : Option [String ],
70
- tableName : String ,
69
+ tableIdentifier : Seq [String ],
71
70
plan : LogicalPlan ): Unit = {
72
- val (dbName, tblName) = processDatabaseAndTableName(databaseName, tableName )
73
- tables += ((tblName , plan))
71
+ val tableIdent = processTableIdentifier(tableIdentifier )
72
+ tables += ((getDbTableName(tableIdent) , plan))
74
73
}
75
74
76
- override def unregisterTable (
77
- databaseName : Option [String ],
78
- tableName : String ) = {
79
- val (dbName, tblName) = processDatabaseAndTableName(databaseName, tableName)
80
- tables -= tblName
75
+ override def unregisterTable (tableIdentifier : Seq [String ]) = {
76
+ val tableIdent = processTableIdentifier(tableIdentifier)
77
+ tables -= getDbTableName(tableIdent)
81
78
}
82
79
83
80
override def unregisterAllTables () = {
84
81
tables.clear()
85
82
}
86
83
87
- override def tableExists (db : Option [String ], tableName : String ): Boolean = {
88
- val (dbName, tblName) = processDatabaseAndTableName(db, tableName )
89
- tables.get(tblName ) match {
84
+ override def tableExists (tableIdentifier : Seq [String ]): Boolean = {
85
+ val tableIdent = processTableIdentifier(tableIdentifier )
86
+ tables.get(getDbTableName(tableIdent) ) match {
90
87
case Some (_) => true
91
88
case None => false
92
89
}
93
90
}
94
91
95
92
override def lookupRelation (
96
- databaseName : Option [String ],
97
- tableName : String ,
93
+ tableIdentifier : Seq [String ],
98
94
alias : Option [String ] = None ): LogicalPlan = {
99
- val (dbName, tblName) = processDatabaseAndTableName(databaseName, tableName)
100
- val table = tables.getOrElse(tblName, sys.error(s " Table Not Found: $tableName" ))
101
- val tableWithQualifiers = Subquery (tblName, table)
95
+ val tableIdent = processTableIdentifier(tableIdentifier)
96
+ val tableFullName = getDbTableName(tableIdent)
97
+ val table = tables.getOrElse(tableFullName, sys.error(s " Table Not Found: $tableFullName" ))
98
+ val tableWithQualifiers = Subquery (tableIdent.last, table)
102
99
103
100
// If an alias was specified by the lookup, wrap the plan in a subquery so that attributes are
104
101
// properly qualified with this alias.
@@ -117,41 +114,39 @@ trait OverrideCatalog extends Catalog {
117
114
// TODO: This doesn't work when the database changes...
118
115
val overrides = new mutable.HashMap [(Option [String ],String ), LogicalPlan ]()
119
116
120
- abstract override def tableExists (db : Option [String ], tableName : String ): Boolean = {
121
- val (dbName, tblName) = processDatabaseAndTableName(db, tableName )
122
- overrides.get((dbName, tblName )) match {
117
+ abstract override def tableExists (tableIdentifier : Seq [String ]): Boolean = {
118
+ val tableIdent = processTableIdentifier(tableIdentifier )
119
+ overrides.get(getDBTable(tableIdent )) match {
123
120
case Some (_) => true
124
- case None => super .tableExists(db, tableName )
121
+ case None => super .tableExists(tableIdentifier )
125
122
}
126
123
}
127
124
128
125
abstract override def lookupRelation (
129
- databaseName : Option [String ],
130
- tableName : String ,
126
+ tableIdentifier : Seq [String ],
131
127
alias : Option [String ] = None ): LogicalPlan = {
132
- val (dbName, tblName) = processDatabaseAndTableName(databaseName, tableName )
133
- val overriddenTable = overrides.get((dbName, tblName ))
134
- val tableWithQualifers = overriddenTable.map(r => Subquery (tblName , r))
128
+ val tableIdent = processTableIdentifier(tableIdentifier )
129
+ val overriddenTable = overrides.get(getDBTable(tableIdent ))
130
+ val tableWithQualifers = overriddenTable.map(r => Subquery (tableIdent.last , r))
135
131
136
132
// If an alias was specified by the lookup, wrap the plan in a subquery so that attributes are
137
133
// properly qualified with this alias.
138
134
val withAlias =
139
135
tableWithQualifers.map(r => alias.map(a => Subquery (a, r)).getOrElse(r))
140
136
141
- withAlias.getOrElse(super .lookupRelation(dbName, tblName , alias))
137
+ withAlias.getOrElse(super .lookupRelation(tableIdentifier , alias))
142
138
}
143
139
144
140
override def registerTable (
145
- databaseName : Option [String ],
146
- tableName : String ,
141
+ tableIdentifier : Seq [String ],
147
142
plan : LogicalPlan ): Unit = {
148
- val (dbName, tblName) = processDatabaseAndTableName(databaseName, tableName )
149
- overrides.put((dbName, tblName ), plan)
143
+ val tableIdent = processTableIdentifier(tableIdentifier )
144
+ overrides.put(getDBTable(tableIdent ), plan)
150
145
}
151
146
152
- override def unregisterTable (databaseName : Option [String ], tableName : String ): Unit = {
153
- val (dbName, tblName) = processDatabaseAndTableName(databaseName, tableName )
154
- overrides.remove((dbName, tblName ))
147
+ override def unregisterTable (tableIdentifier : Seq [String ]): Unit = {
148
+ val tableIdent = processTableIdentifier(tableIdentifier )
149
+ overrides.remove(getDBTable(tableIdent ))
155
150
}
156
151
157
152
override def unregisterAllTables (): Unit = {
@@ -167,22 +162,21 @@ object EmptyCatalog extends Catalog {
167
162
168
163
val caseSensitive : Boolean = true
169
164
170
- def tableExists (db : Option [String ], tableName : String ): Boolean = {
165
+ def tableExists (tableIdentifier : Seq [String ]): Boolean = {
171
166
throw new UnsupportedOperationException
172
167
}
173
168
174
169
def lookupRelation (
175
- databaseName : Option [String ],
176
- tableName : String ,
170
+ tableIdentifier : Seq [String ],
177
171
alias : Option [String ] = None ) = {
178
172
throw new UnsupportedOperationException
179
173
}
180
174
181
- def registerTable (databaseName : Option [String ], tableName : String , plan : LogicalPlan ): Unit = {
175
+ def registerTable (tableIdentifier : Seq [String ], plan : LogicalPlan ): Unit = {
182
176
throw new UnsupportedOperationException
183
177
}
184
178
185
- def unregisterTable (databaseName : Option [String ], tableName : String ): Unit = {
179
+ def unregisterTable (tableIdentifier : Seq [String ]): Unit = {
186
180
throw new UnsupportedOperationException
187
181
}
188
182
0 commit comments