Skip to content

Commit

Permalink
RANGER-4387: optimize loading of userstore from database
Browse files Browse the repository at this point in the history
  • Loading branch information
mneethiraj committed Aug 31, 2023
1 parent 5afc852 commit 1cf5934
Show file tree
Hide file tree
Showing 5 changed files with 112 additions and 35 deletions.
50 changes: 50 additions & 0 deletions security-admin/src/main/java/org/apache/ranger/db/XXGroupDao.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,12 +25,23 @@
import java.util.List;
import java.util.Map;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import org.apache.commons.lang3.StringUtils;
import org.apache.ranger.common.db.BaseDao;
import org.apache.ranger.entity.XXGroup;
import org.apache.ranger.plugin.model.GroupInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import javax.persistence.NoResultException;

@Service
public class XXGroupDao extends BaseDao<XXGroup> {
private static final Logger logger = LoggerFactory.getLogger(XXGroupDao.class);

private static final Gson gsonBuilder = new GsonBuilder().create();

public XXGroupDao(RangerDaoManagerBase daoManager) {
super(daoManager);
Expand Down Expand Up @@ -82,4 +93,43 @@ public Map<Long, String> getAllGroupIdNames() {
}
return groups;
}


public List<GroupInfo> getAllGroupsInfo() {
List<GroupInfo> ret = new ArrayList<>();

try {
List<Object[]> rows = getEntityManager().createNamedQuery("XXGroup.getAllGroupsInfo", Object[].class).getResultList();

if (rows != null) {
for (Object[] row : rows) {

ret.add(toGroupInfo(row));
}
}
} catch (NoResultException excp) {
if (logger.isDebugEnabled()) {
logger.debug(excp.getMessage());
}
}

return ret;
}

private GroupInfo toGroupInfo(Object[] row) {
String name = (String) row[0];
String description = (String) row[1];
String attributes = (String) row[2];
Map<String, String> attrMap = null;

if (StringUtils.isNotBlank(attributes)) {
try {
attrMap = gsonBuilder.fromJson(attributes, Map.class);
} catch (Exception excp) {
// ignore
}
}

return new GroupInfo(name, description, attrMap);
}
}
47 changes: 46 additions & 1 deletion security-admin/src/main/java/org/apache/ranger/db/XXUserDao.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,12 @@

import javax.persistence.NoResultException;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import org.apache.commons.lang3.StringUtils;
import org.apache.ranger.common.db.BaseDao;
import org.apache.ranger.entity.XXUser;
import org.apache.ranger.plugin.model.UserInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
Expand All @@ -34,9 +38,12 @@
import java.util.ArrayList;
import java.util.HashMap;


@Service
public class XXUserDao extends BaseDao<XXUser> {
private static final Logger logger = LoggerFactory.getLogger(XXResourceDao.class);
private static final Logger logger = LoggerFactory.getLogger(XXUserDao.class);

private static final Gson gsonBuilder = new GsonBuilder().create();

public XXUserDao(RangerDaoManagerBase daoManager) {
super(daoManager);
Expand Down Expand Up @@ -122,4 +129,42 @@ public List<Object[]> getAllUserIdNames() {
}
return users;
}

public List<UserInfo> getAllUsersInfo() {
List<UserInfo> ret = new ArrayList<>();

try {
List<Object[]> rows = getEntityManager().createNamedQuery("XXUser.getAllUsersInfo", Object[].class).getResultList();

if (rows != null) {
for (Object[] row : rows) {

ret.add(toUserInfo(row));
}
}
} catch (NoResultException excp) {
if (logger.isDebugEnabled()) {
logger.debug(excp.getMessage());
}
}

return ret;
}

private UserInfo toUserInfo(Object[] row) {
String name = (String) row[0];
String description = (String) row[1];
String attributes = (String) row[2];
Map<String, String> attrMap = null;

if (StringUtils.isNotBlank(attributes)) {
try {
attrMap = gsonBuilder.fromJson(attributes, Map.class);
} catch (Exception excp) {
// ignore
}
}

return new UserInfo(name, description, attrMap);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,7 @@

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.google.gson.Gson;

import com.google.gson.GsonBuilder;
import org.apache.ranger.common.SearchCriteria;
import org.apache.ranger.entity.XXGroup;
import org.apache.ranger.plugin.model.GroupInfo;
Expand All @@ -40,7 +37,6 @@
public abstract class XGroupServiceBase<T extends XXGroup, V extends VXGroup>
extends AbstractBaseResourceService<T, V> {
public static final String NAME = "XGroup";
private static final Gson gsonBuilder = new GsonBuilder().create();

public XGroupServiceBase() {

Expand Down Expand Up @@ -108,18 +104,6 @@ public List<Long> searchXGroupsForIds(SearchCriteria searchCriteria){
}

public List<GroupInfo> getGroups() {
List<GroupInfo> returnList = new ArrayList<>();

@SuppressWarnings("unchecked")
List<XXGroup> resultList = daoManager.getXXGroup().getAll();

// Iterate over the result list and create the return list
for (XXGroup gjXGroup : resultList) {
GroupInfo groupInfo = new GroupInfo(gjXGroup.getName(), gjXGroup.getDescription(), gsonBuilder.fromJson(gjXGroup.getOtherAttributes(), Map.class));
returnList.add(groupInfo);
}

return returnList;
return daoManager.getXXGroup().getAllGroupsInfo();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,7 @@

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import com.google.gson.Gson;

import com.google.gson.GsonBuilder;
import org.apache.ranger.common.SearchCriteria;
import org.apache.ranger.entity.XXUser;
import org.apache.ranger.plugin.model.UserInfo;
Expand All @@ -40,7 +37,6 @@
public abstract class XUserServiceBase<T extends XXUser, V extends VXUser>
extends AbstractBaseResourceService<T, V> {
public static final String NAME = "XUser";
private static final Gson gsonBuilder = new GsonBuilder().create();

public XUserServiceBase() {

Expand Down Expand Up @@ -109,18 +105,6 @@ public List<Long> searchXUsersForIds(SearchCriteria searchCriteria){
}

public List<UserInfo> getUsers() {
List<UserInfo> returnList = new ArrayList<>();

@SuppressWarnings("unchecked")
List<XXUser> resultList = daoManager.getXXUser().getAll();

// Iterate over the result list and create the return list
for (XXUser gjXUser : resultList) {
UserInfo userInfo = new UserInfo(gjXUser.getName(), gjXUser.getDescription(), gsonBuilder.fromJson(gjXUser.getOtherAttributes(), Map.class));
returnList.add(userInfo);
}

return returnList;
return daoManager.getXXUser().getAllUsersInfo();
}

}
14 changes: 14 additions & 0 deletions security-admin/src/main/resources/META-INF/jpa_named_queries.xml
Original file line number Diff line number Diff line change
Expand Up @@ -161,6 +161,13 @@
</query>
</named-query>

<named-query name="XXGroup.getAllGroupsInfo">
<query>SELECT group.name, group.description, group.otherAttributes
FROM XXGroup group
WHERE group.isVisible = 1
</query>
</named-query>

<!-- XXGroup -->
<named-query name="XXUser.findGroupsByUserIds">
<query>SELECT user.name, group.name FROM XXUser user, XXGroup group, XXGroupUser groupUser
Expand All @@ -178,6 +185,13 @@
</query>
</named-query>

<named-query name="XXUser.getAllUsersInfo">
<query>SELECT user.name, user.description, user.otherAttributes
FROM XXUser user
WHERE user.isVisible = 1
</query>
</named-query>

<named-query name="XXGroupUser.findUsersByGroupIds">
<query>SELECT group.name, user.name FROM XXUser user, XXGroup group, XXGroupUser groupUser
WHERE user.id=groupUser.userId and group.id=groupUser.parentGroupId
Expand Down

0 comments on commit 1cf5934

Please sign in to comment.