@Override // TODO should we use GridTypes here? public Number nextValue(NextValueRequest request) { final AdvancedCache<ISK, Object> identifierCache = getCacheManager().getIdSourceCache(request.getKey().getMetadata()).getAdvancedCache(); ISK cacheKey = getKeyProvider().getIdSourceCacheKey(request.getKey()); boolean done; Number value; do { // skip locking proposed by Sanne value = (Number) identifierCache.withFlags(Flag.SKIP_LOCKING).get(cacheKey); if (value == null) { value = Long.valueOf(request.getInitialValue()); final Number oldValue = (Number) identifierCache.putIfAbsent(cacheKey, value); if (oldValue != null) { value = oldValue; } } Number newValue = value.longValue() + request.getIncrement(); done = identifierCache.replace(cacheKey, value, newValue); } while (!done); return value; }
@Override public Number nextValue(NextValueRequest request) { final Cache<ISK> cache = getCacheManager().getIdSourceCache(request.getKey().getMetadata()); ISK key = getKeyProvider().getIdSourceCacheKey(request.getKey()); Element previousValue = cache.get(key); if (previousValue == null) { previousValue = cache.putIfAbsent(new Element(key, request.getInitialValue())); } if (previousValue != null) { while (!cache.replace( previousValue, new Element( key, ((Number) previousValue.getObjectValue()).longValue() + request.getIncrement()))) { previousValue = cache.get(key); } return ((Number) previousValue.getObjectValue()).longValue() + request.getIncrement(); } else { return request.getInitialValue(); } }
@Override public Number nextValue(NextValueRequest request) { return neo4jSequenceGenerator.nextValue( request.getKey(), request.getIncrement(), request.getInitialValue()); }