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

View File

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

View File

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