package org.infinispan.commands.read; import org.infinispan.Cache; import org.infinispan.commands.VisitableCommand; import org.infinispan.commands.Visitor; import org.infinispan.commons.util.EnumUtil; import org.infinispan.context.Flag; import org.infinispan.context.InvocationContext; /** * Command to calculate the size of the cache * * @author Manik Surtani (<a href="mailto:manik@jboss.org">manik@jboss.org</a>) * @author Mircea.Markus@jboss.com * @author <a href="http://gleamynode.net/">Trustin Lee</a> * @since 4.0 */ public class SizeCommand extends AbstractLocalCommand implements VisitableCommand { private final Cache<Object, ?> cache; public SizeCommand(Cache<Object, ?> cache, long flags) { setFlagsBitSet(flags); if (flags != EnumUtil.EMPTY_BIT_SET) { this.cache = cache.getAdvancedCache().withFlags(EnumUtil.enumArrayOf(flags, Flag.class)); } else { this.cache = cache; } } @Override public Object acceptVisitor(InvocationContext ctx, Visitor visitor) throws Throwable { return visitor.visitSizeCommand(ctx, this); } @Override public LoadType loadType() { throw new UnsupportedOperationException(); } @Override public Integer perform(InvocationContext ctx) throws Throwable { long size = cache.keySet().stream().count(); if (size > Integer.MAX_VALUE) { return Integer.MAX_VALUE; } else { return (int) size; } } @Override public String toString() { return "SizeCommand{}"; } }