From 81afd13f2496781a41f40fcd76d73202302ded0e Mon Sep 17 00:00:00 2001 From: alena Date: Thu, 10 Feb 2011 15:07:38 -0800 Subject: [PATCH] bug 7907: introduced "exactMatch" flag for listAccounts command (not required, default to "false" if not specified). If it's set to "true", we do exact search by accountName status 7907: resolved fixed --- .../com/cloud/server/ManagementServer.java | 3 ++- server/src/com/cloud/api/BaseCmd.java | 3 ++- .../cloud/api/commands/ListAccountsCmd.java | 15 ++++++++--- .../cloud/server/ManagementServerImpl.java | 25 +++++++++++++++---- 4 files changed, 35 insertions(+), 11 deletions(-) diff --git a/core/src/com/cloud/server/ManagementServer.java b/core/src/com/cloud/server/ManagementServer.java index 4400fc9189f..31c7410cf03 100644 --- a/core/src/com/cloud/server/ManagementServer.java +++ b/core/src/com/cloud/server/ManagementServer.java @@ -1645,9 +1645,10 @@ public interface ManagementServer { * Searches for accounts by the specified search criteria * Can search by: "id", "name", "domainid", "type" * @param c + * @param exactMatch TODO * @return List of Accounts */ - List searchForAccounts(Criteria c); + List searchForAccounts(Criteria c, boolean exactMatch); /** diff --git a/server/src/com/cloud/api/BaseCmd.java b/server/src/com/cloud/api/BaseCmd.java index 6cec5b10d75..3e1b2de965a 100644 --- a/server/src/com/cloud/api/BaseCmd.java +++ b/server/src/com/cloud/api/BaseCmd.java @@ -398,7 +398,8 @@ public abstract class BaseCmd { SCOPE("scope", BaseCmd.TYPE_STRING, "scope"), SUM_ACROSS_ZONE("sumacrosszone", BaseCmd.TYPE_BOOLEAN, "sumAcrossZone"), EXCEPTION("exception", BaseCmd.TYPE_STRING, "excetpion"), - HOST_TAGS("hosttags", BaseCmd.TYPE_STRING, "hostTags"); + HOST_TAGS("hosttags", BaseCmd.TYPE_STRING, "hostTags"), + EXACT_MATCH("exactmatch", BaseCmd.TYPE_BOOLEAN, "exactMatch"); private final String _name; private final short _dataType; diff --git a/server/src/com/cloud/api/commands/ListAccountsCmd.java b/server/src/com/cloud/api/commands/ListAccountsCmd.java index d384be4100c..c307630562f 100644 --- a/server/src/com/cloud/api/commands/ListAccountsCmd.java +++ b/server/src/com/cloud/api/commands/ListAccountsCmd.java @@ -53,7 +53,8 @@ public class ListAccountsCmd extends BaseCmd{ s_properties.add(new Pair(BaseCmd.Properties.ACCOUNT, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.DOMAIN_ID, Boolean.FALSE)); s_properties.add(new Pair(BaseCmd.Properties.PAGE, Boolean.FALSE)); - s_properties.add(new Pair(BaseCmd.Properties.PAGESIZE, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.PAGESIZE, Boolean.FALSE)); + s_properties.add(new Pair(BaseCmd.Properties.EXACT_MATCH, Boolean.FALSE)); } public String getName() { @@ -74,8 +75,10 @@ public class ListAccountsCmd extends BaseCmd{ Integer page = (Integer)params.get(BaseCmd.Properties.PAGE.getName()); Integer pageSize = (Integer)params.get(BaseCmd.Properties.PAGESIZE.getName()); String keyword = (String)params.get(BaseCmd.Properties.KEYWORD.getName()); - boolean isAdmin = false; - Long accountId = null; + boolean isAdmin = false; + boolean doExactSearch = false; + Long accountId = null; + Boolean exactMatch = (Boolean)params.get(BaseCmd.Properties.EXACT_MATCH.getName()); String accountName = null; @@ -93,6 +96,10 @@ public class ListAccountsCmd extends BaseCmd{ } else { accountName = (String)params.get(BaseCmd.Properties.ACCOUNT.getName()); accountId = account.getId(); + } + + if (exactMatch != null) { + doExactSearch = exactMatch; } Long startIndex = Long.valueOf(0); @@ -119,7 +126,7 @@ public class ListAccountsCmd extends BaseCmd{ c.addCriteria(Criteria.ID, accountId); } - List accounts = getManagementServer().searchForAccounts(c); + List accounts = getManagementServer().searchForAccounts(c, doExactSearch); List> accountTags = new ArrayList>(); Object[] aTag = new Object[accounts.size()]; diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index 3123f6e60f3..007d8bd5246 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -4330,7 +4330,7 @@ public class ManagementServerImpl implements ManagementServer { } @Override - public List searchForAccounts(Criteria c) { + public List searchForAccounts(Criteria c, boolean exactMatch) { Filter searchFilter = new Filter(AccountVO.class, c.getOrderBy(), c.getAscending(), c.getOffset(), c.getLimit()); Object id = c.getCriteria(Criteria.ID); @@ -4342,7 +4342,12 @@ public class ManagementServerImpl implements ManagementServer { Object keyword = c.getCriteria(Criteria.KEYWORD); SearchBuilder sb = _accountDao.createSearchBuilder(); - sb.and("accountName", sb.entity().getAccountName(), SearchCriteria.Op.LIKE); + if (exactMatch) { + sb.and("accountName", sb.entity().getAccountName(), SearchCriteria.Op.EQ); + } else { + sb.and("accountName", sb.entity().getAccountName(), SearchCriteria.Op.LIKE); + } + sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); sb.and("nid", sb.entity().getId(), SearchCriteria.Op.NEQ); sb.and("type", sb.entity().getType(), SearchCriteria.Op.EQ); @@ -4359,14 +4364,24 @@ public class ManagementServerImpl implements ManagementServer { SearchCriteria sc = sb.create(); if (keyword != null) { SearchCriteria ssc = _accountDao.createSearchCriteria(); - ssc.addOr("accountName", SearchCriteria.Op.LIKE, "%" + keyword + "%"); - ssc.addOr("state", SearchCriteria.Op.LIKE, "%" + keyword + "%"); + + if (exactMatch) { + ssc.addOr("accountName", SearchCriteria.Op.EQ, keyword); + } else { + ssc.addOr("accountName", SearchCriteria.Op.LIKE, "%" + keyword + "%"); + } + + ssc.addOr("state", SearchCriteria.Op.EQ, keyword); sc.addAnd("accountName", SearchCriteria.Op.SC, ssc); } if (accountname != null) { - sc.setParameters("accountName", "%" + accountname + "%"); + if (exactMatch) { + sc.setParameters("accountName", accountname); + } else { + sc.setParameters("accountName", "%" + accountname + "%"); + } } if (id != null) {