cache user search results

This commit is contained in:
Sebastian Sdorra
2011-02-12 11:24:08 +01:00
parent cf12390b0b
commit b81610a9f3
3 changed files with 83 additions and 35 deletions

View File

@@ -41,10 +41,17 @@ import com.google.inject.Inject;
import com.google.inject.Provider; import com.google.inject.Provider;
import com.google.inject.Singleton; import com.google.inject.Singleton;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import sonia.scm.HandlerEvent;
import sonia.scm.api.rest.SearchResult; import sonia.scm.api.rest.SearchResult;
import sonia.scm.api.rest.SearchResults; import sonia.scm.api.rest.SearchResults;
import sonia.scm.cache.Cache;
import sonia.scm.cache.CacheManager;
import sonia.scm.search.SearchRequest; import sonia.scm.search.SearchRequest;
import sonia.scm.user.User; import sonia.scm.user.User;
import sonia.scm.user.UserListener;
import sonia.scm.user.UserManager; import sonia.scm.user.UserManager;
import sonia.scm.util.SecurityUtil; import sonia.scm.util.SecurityUtil;
import sonia.scm.util.Util; import sonia.scm.util.Util;
@@ -55,7 +62,6 @@ import sonia.scm.web.security.WebSecurityContext;
import java.util.Collection; import java.util.Collection;
import javax.ws.rs.GET; import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path; import javax.ws.rs.Path;
import javax.ws.rs.QueryParam; import javax.ws.rs.QueryParam;
import javax.ws.rs.WebApplicationException; import javax.ws.rs.WebApplicationException;
@@ -67,26 +73,52 @@ import javax.ws.rs.core.Response.Status;
*/ */
@Singleton @Singleton
@Path("search") @Path("search")
public class SearchResource public class SearchResource implements UserListener
{ {
/** Field description */
public static final String CACHE_USER = "sonia.cache.search.users";
/** the logger for SearchResource */
private static final Logger logger =
LoggerFactory.getLogger(SearchResource.class);
//~--- constructors ---------------------------------------------------------
/** /**
* Constructs ... * Constructs ...
* *
* *
* @param securityContextProvider * @param securityContextProvider
* @param userManager * @param userManager
* @param cacheManager
*/ */
@Inject @Inject
public SearchResource(Provider<WebSecurityContext> securityContextProvider, public SearchResource(Provider<WebSecurityContext> securityContextProvider,
UserManager userManager) UserManager userManager, CacheManager cacheManager)
{ {
this.securityContextProvider = securityContextProvider; this.securityContextProvider = securityContextProvider;
this.userManager = userManager; this.userManager = userManager;
this.userManager.addListener(this);
this.userSearchCache = cacheManager.getCache(String.class,
SearchResults.class, CACHE_USER);
} }
//~--- methods -------------------------------------------------------------- //~--- methods --------------------------------------------------------------
/**
* Method description
*
*
* @param user
* @param event
*/
@Override
public void onEvent(User user, HandlerEvent event)
{
userSearchCache.clear();
}
/** /**
* Method description * Method description
* *
@@ -106,28 +138,38 @@ public class SearchResource
throw new WebApplicationException(Status.BAD_REQUEST); throw new WebApplicationException(Status.BAD_REQUEST);
} }
SearchRequest request = new SearchRequest(queryString, true); SearchResults result = userSearchCache.get(queryString);
request.setMaxResults(5); if (result == null)
Collection<User> users = userManager.search(request);
SearchResults result = new SearchResults();
if (Util.isNotEmpty(users))
{ {
Collection<SearchResult> resultCollection = Collections2.transform(users, SearchRequest request = new SearchRequest(queryString, true);
new Function<User,
SearchResult>()
{
@Override
public SearchResult apply(User user)
{
return new SearchResult(user.getName(), user.getDisplayName());
}
});
result.setSuccess(true); request.setMaxResults(5);
result.setResults(resultCollection);
Collection<User> users = userManager.search(request);
result = new SearchResults();
if (Util.isNotEmpty(users))
{
Collection<SearchResult> resultCollection =
Collections2.transform(users, new Function<User, SearchResult>()
{
@Override
public SearchResult apply(User user)
{
return new SearchResult(user.getName(), user.getDisplayName());
}
});
result.setSuccess(true);
result.setResults(resultCollection);
userSearchCache.put(queryString, result);
}
}
else if (logger.isDebugEnabled())
{
logger.debug("return searchresults for {} from cache", queryString);
} }
return result; return result;
@@ -140,4 +182,7 @@ public class SearchResource
/** Field description */ /** Field description */
private UserManager userManager; private UserManager userManager;
/** Field description */
private Cache<String, SearchResults> userSearchCache;
} }

View File

@@ -335,6 +335,11 @@ public class XmlUserManager extends AbstractUserManager
@Override @Override
public Collection<User> search(final SearchRequest searchRequest) public Collection<User> search(final SearchRequest searchRequest)
{ {
if (logger.isDebugEnabled())
{
logger.debug("search user with query {}", searchRequest.getQuery());
}
List<User> users = new ArrayList<User>(); List<User> users = new ArrayList<User>();
int index = 0; int index = 0;
int counter = 0; int counter = 0;

View File

@@ -90,10 +90,10 @@
<defaultCache <defaultCache
maxElementsInMemory="20000" maxElementsInMemory="20000"
eternal="false" eternal="false"
overflowToDisk="true" overflowToDisk="false"
timeToIdleSeconds="1200" timeToIdleSeconds="1200"
timeToLiveSeconds="2400" timeToLiveSeconds="2400"
diskPersistent="true" diskPersistent="false"
diskExpiryThreadIntervalSeconds="2400" diskExpiryThreadIntervalSeconds="2400"
/> />
@@ -107,17 +107,6 @@
diskPersistent="false" diskPersistent="false"
/> />
<cache
name="sonia.cache.repository"
maxElementsInMemory="20000"
eternal="false"
overflowToDisk="true"
timeToIdleSeconds="1200"
timeToLiveSeconds="2400"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="2400"
/>
<cache <cache
name="sonia.cache.plugins" name="sonia.cache.plugins"
maxElementsInMemory="10" maxElementsInMemory="10"
@@ -127,4 +116,13 @@
diskPersistent="false" diskPersistent="false"
/> />
<cache
name="sonia.cache.search.users"
maxElementsInMemory="10000"
eternal="false"
overflowToDisk="false"
timeToLiveSeconds="5400"
diskPersistent="false"
/>
</ehcache> </ehcache>