Skip to content

Commit 8303a04

Browse files
authored
[#9238] fix(authz): fix list tags for columns error (#9257)
### What changes were proposed in this pull request? fix list tags for columns error ### Why are the changes needed? Fix: #9238 ### Does this PR introduce _any_ user-facing change? None ### How was this patch tested? org.apache.gravitino.client.integration.test.authorization.TagOperationsAuthorizationIT#testListColumnTag
1 parent 1d6de4c commit 8303a04

File tree

3 files changed

+50
-60
lines changed

3 files changed

+50
-60
lines changed

clients/client-java/src/test/java/org/apache/gravitino/client/integration/test/authorization/TagOperationsAuthorizationIT.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import org.apache.gravitino.tag.SupportsTags;
5050
import org.apache.gravitino.tag.TagChange;
5151
import org.junit.jupiter.api.AfterAll;
52+
import org.junit.jupiter.api.Assertions;
5253
import org.junit.jupiter.api.BeforeAll;
5354
import org.junit.jupiter.api.MethodOrderer;
5455
import org.junit.jupiter.api.Order;
@@ -96,6 +97,7 @@ public void startIntegrationTest() throws Exception {
9697
// grant tester privilege
9798
List<SecurableObject> securableObjects = new ArrayList<>();
9899
GravitinoMetalake gravitinoMetalake = client.loadMetalake(METALAKE);
100+
99101
SecurableObject catalogObject =
100102
SecurableObjects.ofCatalog(CATALOG, ImmutableList.of(Privileges.UseCatalog.allow()));
101103
securableObjects.add(catalogObject);
@@ -283,6 +285,22 @@ public void testListTagByMetadata() {
283285

284286
@Test
285287
@Order(8)
288+
public void testListColumnTag() {
289+
GravitinoMetalake gravitinoMetalake = client.loadMetalake(METALAKE);
290+
SupportsTags columnSupportTag =
291+
gravitinoMetalake
292+
.loadCatalog(CATALOG)
293+
.asTableCatalog()
294+
.loadTable(NameIdentifier.of(SCHEMA, "table1"))
295+
.columns()[0]
296+
.supportsTags();
297+
String[] tags = columnSupportTag.listTags();
298+
Arrays.sort(tags);
299+
Assertions.assertArrayEquals(new String[] {"tag1", "tag2", "tag3"}, tags);
300+
}
301+
302+
@Test
303+
@Order(9)
286304
public void testDropTag() {
287305
GravitinoMetalake gravitinoMetalakeLoadByNormalUser = normalUserClient.loadMetalake(METALAKE);
288306
assertThrows(

core/src/main/java/org/apache/gravitino/utils/NameIdentifierUtil.java

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,34 @@ public static NameIdentifier getSchemaIdentifier(NameIdentifier ident)
370370
return NameIdentifier.of(allElems.get(0), allElems.get(1), allElems.get(2));
371371
}
372372

373+
/**
374+
* Try to get the table {@link NameIdentifier} from the given {@link NameIdentifier}.
375+
*
376+
* @param ident The {@link NameIdentifier} to check.
377+
* @return The table {@link NameIdentifier}
378+
* @throws IllegalNameIdentifierException If the given {@link NameIdentifier} does not include
379+
* table name
380+
*/
381+
public static NameIdentifier getTableIdentifier(NameIdentifier ident)
382+
throws IllegalNameIdentifierException {
383+
NameIdentifier.check(
384+
ident.name() != null && !ident.name().isEmpty(),
385+
"The name variable in the NameIdentifier must have value.");
386+
Namespace.check(
387+
ident.namespace() != null && !ident.namespace().isEmpty() && ident.namespace().length() > 2,
388+
"Table namespace must be non-null and at least 2 level, the input namespace is %s",
389+
ident.namespace());
390+
391+
List<String> allElems =
392+
Stream.concat(Arrays.stream(ident.namespace().levels()), Stream.of(ident.name()))
393+
.collect(Collectors.toList());
394+
if (allElems.size() < 4) {
395+
throw new IllegalNameIdentifierException(
396+
"Cannot create a table NameIdentifier less than four elements.");
397+
}
398+
return NameIdentifier.of(allElems.get(0), allElems.get(1), allElems.get(2), allElems.get(3));
399+
}
400+
373401
/**
374402
* Check the given {@link NameIdentifier} is a metalake identifier. Throw an {@link
375403
* IllegalNameIdentifierException} if it's not.

server-common/src/main/java/org/apache/gravitino/server/authorization/MetadataAuthzHelper.java

Lines changed: 4 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -257,66 +257,10 @@ public static Map<Entity.EntityType, NameIdentifier> splitMetadataNames(
257257
String metalake, Entity.EntityType entityType, NameIdentifier nameIdentifier) {
258258
Map<Entity.EntityType, NameIdentifier> nameIdentifierMap = new HashMap<>();
259259
nameIdentifierMap.put(Entity.EntityType.METALAKE, NameIdentifierUtil.ofMetalake(metalake));
260-
switch (entityType) {
261-
case CATALOG:
262-
nameIdentifierMap.put(Entity.EntityType.CATALOG, nameIdentifier);
263-
break;
264-
case SCHEMA:
265-
nameIdentifierMap.put(Entity.EntityType.SCHEMA, nameIdentifier);
266-
nameIdentifierMap.put(
267-
Entity.EntityType.CATALOG, NameIdentifierUtil.getCatalogIdentifier(nameIdentifier));
268-
break;
269-
case TABLE:
270-
nameIdentifierMap.put(Entity.EntityType.TABLE, nameIdentifier);
271-
nameIdentifierMap.put(
272-
Entity.EntityType.SCHEMA, NameIdentifierUtil.getSchemaIdentifier(nameIdentifier));
273-
nameIdentifierMap.put(
274-
Entity.EntityType.CATALOG, NameIdentifierUtil.getCatalogIdentifier(nameIdentifier));
275-
break;
276-
case MODEL:
277-
nameIdentifierMap.put(Entity.EntityType.MODEL, nameIdentifier);
278-
nameIdentifierMap.put(
279-
Entity.EntityType.SCHEMA, NameIdentifierUtil.getSchemaIdentifier(nameIdentifier));
280-
nameIdentifierMap.put(
281-
Entity.EntityType.CATALOG, NameIdentifierUtil.getCatalogIdentifier(nameIdentifier));
282-
break;
283-
case MODEL_VERSION:
284-
nameIdentifierMap.put(Entity.EntityType.MODEL_VERSION, nameIdentifier);
285-
nameIdentifierMap.put(
286-
Entity.EntityType.MODEL, NameIdentifierUtil.getModelIdentifier(nameIdentifier));
287-
nameIdentifierMap.put(
288-
Entity.EntityType.SCHEMA, NameIdentifierUtil.getSchemaIdentifier(nameIdentifier));
289-
nameIdentifierMap.put(
290-
Entity.EntityType.CATALOG, NameIdentifierUtil.getCatalogIdentifier(nameIdentifier));
291-
break;
292-
case TOPIC:
293-
nameIdentifierMap.put(Entity.EntityType.TOPIC, nameIdentifier);
294-
nameIdentifierMap.put(
295-
Entity.EntityType.SCHEMA, NameIdentifierUtil.getSchemaIdentifier(nameIdentifier));
296-
nameIdentifierMap.put(
297-
Entity.EntityType.CATALOG, NameIdentifierUtil.getCatalogIdentifier(nameIdentifier));
298-
break;
299-
case FILESET:
300-
nameIdentifierMap.put(Entity.EntityType.FILESET, nameIdentifier);
301-
nameIdentifierMap.put(
302-
Entity.EntityType.SCHEMA, NameIdentifierUtil.getSchemaIdentifier(nameIdentifier));
303-
nameIdentifierMap.put(
304-
Entity.EntityType.CATALOG, NameIdentifierUtil.getCatalogIdentifier(nameIdentifier));
305-
break;
306-
case METALAKE:
307-
nameIdentifierMap.put(entityType, nameIdentifier);
308-
break;
309-
case ROLE:
310-
nameIdentifierMap.put(entityType, nameIdentifier);
311-
break;
312-
case USER:
313-
nameIdentifierMap.put(entityType, nameIdentifier);
314-
break;
315-
case TAG:
316-
nameIdentifierMap.put(entityType, nameIdentifier);
317-
break;
318-
default:
319-
throw new IllegalArgumentException("Unsupported entity type: " + entityType);
260+
while (entityType != Entity.EntityType.METALAKE) {
261+
nameIdentifierMap.put(entityType, nameIdentifier);
262+
entityType = NameIdentifierUtil.parentEntityType(entityType);
263+
nameIdentifier = NameIdentifierUtil.parentNameIdentifier(nameIdentifier, entityType);
320264
}
321265
return nameIdentifierMap;
322266
}

0 commit comments

Comments
 (0)