#ignite-964: add CACHE_PUT_IF_ABSENT method for nodejs cache.
Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/d44d7f20 Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/d44d7f20 Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/d44d7f20 Branch: refs/heads/ignite-964 Commit: d44d7f209e46d7dcf6b35b179016dfbfaf435993 Parents: d7faab3 Author: ivasilinets <ivasilin...@gridgain.com> Authored: Wed Jul 1 15:52:29 2015 +0300 Committer: ivasilinets <ivasilin...@gridgain.com> Committed: Wed Jul 1 15:52:29 2015 +0300 ---------------------------------------------------------------------- .../processors/rest/GridRestCommand.java | 3 ++ .../processors/rest/GridRestProcessor.java | 1 + .../handlers/cache/GridCacheCommandHandler.java | 34 ++++++++++++++++++++ modules/nodejs/src/main/js/cache.js | 14 ++++++++ .../ignite/internal/NodeJsCacheApiSelfTest.java | 7 ++++ modules/nodejs/src/test/js/test-cache-api.js | 15 +++++++++ .../http/jetty/GridJettyRestHandler.java | 4 ++- 7 files changed, 77 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/d44d7f20/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/GridRestCommand.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/GridRestCommand.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/GridRestCommand.java index 4ded850..b8f05bf 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/GridRestCommand.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/GridRestCommand.java @@ -51,6 +51,9 @@ public enum GridRestCommand { /** Store value in cache. */ CACHE_PUT("put"), + /** Store value in cache. */ + CACHE_PUT_IF_ABSENT("putifabsent"), + /** Store value in cache if it doesn't exist. */ CACHE_ADD("add"), http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/d44d7f20/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/GridRestProcessor.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/GridRestProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/GridRestProcessor.java index e477547..b524e92 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/GridRestProcessor.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/GridRestProcessor.java @@ -550,6 +550,7 @@ public class GridRestProcessor extends GridProcessorAdapter { case CACHE_PREPEND: case CACHE_GET_AND_PUT: case CACHE_GET_AND_PUT_IF_ABSENT: + case CACHE_PUT_IF_ABSENT: perm = SecurityPermission.CACHE_PUT; name = ((GridRestCacheRequest)req).cacheName(); http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/d44d7f20/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cache/GridCacheCommandHandler.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cache/GridCacheCommandHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cache/GridCacheCommandHandler.java index ef14582..b5b59fc 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cache/GridCacheCommandHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/cache/GridCacheCommandHandler.java @@ -58,6 +58,7 @@ public class GridCacheCommandHandler extends GridRestCommandHandlerAdapter { CACHE_GET, CACHE_GET_AND_PUT, CACHE_GET_AND_PUT_IF_ABSENT, + CACHE_PUT_IF_ABSENT, CACHE_GET_ALL, CACHE_PUT, CACHE_ADD, @@ -78,6 +79,7 @@ public class GridCacheCommandHandler extends GridRestCommandHandlerAdapter { CACHE_GET, CACHE_GET_AND_PUT, CACHE_GET_AND_PUT_IF_ABSENT, + CACHE_PUT_IF_ABSENT, CACHE_PUT, CACHE_ADD, CACHE_REMOVE, @@ -191,6 +193,19 @@ public class GridCacheCommandHandler extends GridRestCommandHandlerAdapter { break; } + case CACHE_PUT_IF_ABSENT: { + + final Object val = req0.value(); + + if (val == null) + throw new IgniteCheckedException(GridRestCommandHandlerAdapter.missingParameter("val")); + + fut = executeCommand(req.destinationId(), req.clientId(), cacheName, skipStore, key, + new PutIfAbsentCommand(key, val)); + + break; + } + case CACHE_GET_ALL: { fut = executeCommand(req.destinationId(), req.clientId(), cacheName, skipStore, key, new GetAllCommand(getKeys(req0))); @@ -873,6 +888,25 @@ public class GridCacheCommandHandler extends GridRestCommandHandlerAdapter { } /** */ + private static class PutIfAbsentCommand extends GetAndPutCommand { + /** */ + private static final long serialVersionUID = 0L; + + /** + * @param key Key. + * @param val Value. + */ + PutIfAbsentCommand(Object key, Object val) { + super(key, val); + } + + /** {@inheritDoc} */ + @Override public IgniteInternalFuture<?> applyx(IgniteInternalCache<Object, Object> c, GridKernalContext ctx) { + return c.putIfAbsentAsync(key, val); + } + } + + /** */ private static class GetAllCommand extends CacheProjectionCommand { /** */ private static final long serialVersionUID = 0L; http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/d44d7f20/modules/nodejs/src/main/js/cache.js ---------------------------------------------------------------------- diff --git a/modules/nodejs/src/main/js/cache.js b/modules/nodejs/src/main/js/cache.js index 169b3bc..9184154 100644 --- a/modules/nodejs/src/main/js/cache.js +++ b/modules/nodejs/src/main/js/cache.js @@ -61,6 +61,20 @@ Cache.prototype.put = function(key, value, callback) { } /** + * Put if absent + * + * @this {Cache} + * @param {string} key Key + * @param {string} value Value + * @param {onGet} callback Called on finish + */ +Cache.prototype.putIfAbsent = function(key, value, callback) { + this._server.runCommand(this._createCommand("putifabsent"). + setPostData(JSON.stringify({"key": key, "val" : value})), + callback); +} + +/** * Remove cache key * * @this {Cache} http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/d44d7f20/modules/nodejs/src/test/java/org/apache/ignite/internal/NodeJsCacheApiSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/nodejs/src/test/java/org/apache/ignite/internal/NodeJsCacheApiSelfTest.java b/modules/nodejs/src/test/java/org/apache/ignite/internal/NodeJsCacheApiSelfTest.java index a551749..201cc3d 100644 --- a/modules/nodejs/src/test/java/org/apache/ignite/internal/NodeJsCacheApiSelfTest.java +++ b/modules/nodejs/src/test/java/org/apache/ignite/internal/NodeJsCacheApiSelfTest.java @@ -144,6 +144,13 @@ public class NodeJsCacheApiSelfTest extends NodeJsAbstractTest { /** * @throws Exception If failed. */ + public void testPutIfAbsent() throws Exception { + runJsScript("testPutIfAbsent"); + } + + /** + * @throws Exception If failed. + */ public void testGetAndRemove() throws Exception { runJsScript("testGetAndRemove"); } http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/d44d7f20/modules/nodejs/src/test/js/test-cache-api.js ---------------------------------------------------------------------- diff --git a/modules/nodejs/src/test/js/test-cache-api.js b/modules/nodejs/src/test/js/test-cache-api.js index 0840160..466518d 100644 --- a/modules/nodejs/src/test/js/test-cache-api.js +++ b/modules/nodejs/src/test/js/test-cache-api.js @@ -100,6 +100,21 @@ testGetAndPutIfAbsent = function() { startTest("mycache", {trace: [put, getAndPutIfAbsent, getExist], entry: ["key", "6"]}); } +testPutIfAbsent = function() { + function putIfAbsent(cache, entry, next) { + cache.putIfAbsent("key", "7", onPutIfAbsent); + + function onPutIfAbsent(err, res) { + assert(err === null, "Get error on get and put [err=" + err + "]"); + assert(res === false, "Incorrect result for getAndPut [expected=false, val" + res + "]"); + + next(); + } + } + + startTest("mycache", {trace: [put, putIfAbsent, getExist], entry: ["key", "6"]}); +} + testGetAndRemove = function() { function getAndRemove(cache, entry, next) { cache.getAndRemove("key", onGetAndRemove); http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/d44d7f20/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java ---------------------------------------------------------------------- diff --git a/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java b/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java index 4b6ed55..0574786 100644 --- a/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java +++ b/modules/rest-http/src/main/java/org/apache/ignite/internal/processors/rest/protocols/http/jetty/GridJettyRestHandler.java @@ -367,6 +367,7 @@ public class GridJettyRestHandler extends AbstractHandler { case CACHE_GET: case CACHE_GET_ALL: case CACHE_GET_AND_PUT: + case CACHE_PUT_IF_ABSENT: case CACHE_GET_AND_PUT_IF_ABSENT: case CACHE_PUT: case CACHE_PUT_ALL: @@ -418,7 +419,8 @@ public class GridJettyRestHandler extends AbstractHandler { } else if (cmd == CACHE_GET || cmd == CACHE_PUT || cmd == CACHE_REMOVE || cmd == CACHE_CONTAINS_KEY || cmd == CACHE_GET_AND_PUT || - cmd == CACHE_GET_AND_PUT_IF_ABSENT || cmd == CACHE_GET_AND_REMOVE) { + cmd == CACHE_GET_AND_PUT_IF_ABSENT || cmd == CACHE_GET_AND_REMOVE || + cmd == CACHE_PUT_IF_ABSENT) { JSONCacheObject cacheObj = new JSONCacheObject(o); restReq0.cacheName(F.isEmpty(cacheName) ? null : cacheName);