You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by iv...@apache.org on 2015/07/01 15:09:09 UTC

[1/8] incubator-ignite git commit: #ignite-964: add contains key method for nodejs cache.

Repository: incubator-ignite
Updated Branches:
  refs/heads/ignite-964 ad11a4a12 -> 830f397d0


#ignite-964: add contains key 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/7bed77b3
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/7bed77b3
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/7bed77b3

Branch: refs/heads/ignite-964
Commit: 7bed77b375580b62f4bc5b98b32a595716868cad
Parents: ad11a4a
Author: ivasilinets <iv...@gridgain.com>
Authored: Wed Jul 1 13:47:56 2015 +0300
Committer: ivasilinets <iv...@gridgain.com>
Committed: Wed Jul 1 13:47:56 2015 +0300

----------------------------------------------------------------------
 .../processors/rest/GridRestCommand.java        |  3 ++
 .../processors/rest/GridRestProcessor.java      |  2 ++
 .../handlers/cache/GridCacheCommandHandler.java | 30 ++++++++++++++++++++
 modules/nodejs/src/main/js/cache.js             | 30 ++++++++++++++------
 .../ignite/internal/NodeJsCacheApiSelfTest.java | 14 +++++++++
 modules/nodejs/src/test/js/test-cache-api.js    | 30 ++++++++++++++++++++
 .../http/jetty/GridJettyRestHandler.java        |  4 ++-
 7 files changed, 103 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/7bed77b3/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 0afefb6..48d5bcf 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
@@ -33,6 +33,9 @@ public enum GridRestCommand {
     /** Get cached value. */
     CACHE_GET("get"),
 
+    /** Contains cached value. */
+    CACHE_CONTAINS_KEY("containskey"),
+
     /** Get several cached values. */
     CACHE_GET_ALL("getall"),
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/7bed77b3/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 5a073a0..220f2d1 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
@@ -388,6 +388,7 @@ public class GridRestProcessor extends GridProcessorAdapter {
 
         if (interceptor != null && res.getResponse() != null) {
             switch (req.command()) {
+                case CACHE_CONTAINS_KEY:
                 case CACHE_GET:
                 case CACHE_GET_ALL:
                 case CACHE_PUT:
@@ -531,6 +532,7 @@ public class GridRestProcessor extends GridProcessorAdapter {
 
         switch (req.command()) {
             case CACHE_GET:
+            case CACHE_CONTAINS_KEY:
             case CACHE_GET_ALL:
                 perm = SecurityPermission.CACHE_READ;
                 name = ((GridRestCacheRequest)req).cacheName();

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/7bed77b3/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 1f24023..a4dc466 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
@@ -53,6 +53,7 @@ import static org.apache.ignite.transactions.TransactionIsolation.*;
 public class GridCacheCommandHandler extends GridRestCommandHandlerAdapter {
     /** Supported commands. */
     private static final Collection<GridRestCommand> SUPPORTED_COMMANDS = U.sealList(
+        CACHE_CONTAINS_KEY,
         CACHE_GET,
         CACHE_GET_ALL,
         CACHE_PUT,
@@ -69,6 +70,7 @@ public class GridCacheCommandHandler extends GridRestCommandHandlerAdapter {
 
     /** Requests with required parameter {@code key}. */
     private static final EnumSet<GridRestCommand> KEY_REQUIRED_REQUESTS = EnumSet.of(
+        CACHE_CONTAINS_KEY,
         CACHE_GET,
         CACHE_PUT,
         CACHE_ADD,
@@ -137,6 +139,13 @@ public class GridCacheCommandHandler extends GridRestCommandHandlerAdapter {
             IgniteInternalFuture<GridRestResponse> fut;
 
             switch (cmd) {
+                case CACHE_CONTAINS_KEY: {
+                    fut = executeCommand(req.destinationId(), req.clientId(), cacheName, skipStore, key,
+                        new ContainsCommand(key));
+
+                    break;
+                }
+
                 case CACHE_GET: {
                     fut = executeCommand(req.destinationId(), req.clientId(), cacheName, skipStore, key,
                         new GetCommand(key));
@@ -702,6 +711,27 @@ public class GridCacheCommandHandler extends GridRestCommandHandlerAdapter {
     }
 
     /** */
+    private static class ContainsCommand extends CacheProjectionCommand {
+        /** */
+        private static final long serialVersionUID = 0L;
+
+        /** */
+        private final Object key;
+
+        /**
+         * @param key Key.
+         */
+        ContainsCommand(Object key) {
+            this.key = key;
+        }
+
+        /** {@inheritDoc} */
+        @Override public IgniteInternalFuture<?> applyx(IgniteInternalCache<Object, Object> c, GridKernalContext ctx) {
+            return c.containsKeyAsync(key);
+        }
+    }
+
+    /** */
     private static class GetCommand extends CacheProjectionCommand {
         /** */
         private static final long serialVersionUID = 0L;

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/7bed77b3/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 c65f026..2d91fcb 100644
--- a/modules/nodejs/src/main/js/cache.js
+++ b/modules/nodejs/src/main/js/cache.js
@@ -99,18 +99,10 @@ Cache.prototype.putAll = function(entries, callback) {
 }
 
 /**
- * Callback for cache get
- *
- * @callback Cache~onGetAll
- * @param {string} error Error
- * @param {string[]} results Result values
- */
-
-/**
  * Get keys from the cache
  *
  * @this {Cache}
- * @param {string[]} keys Keys
+ * @param {Object[]} keys Keys
  * @param {Cache~onGetAll} callback Called on finish
  */
 Cache.prototype.getAll = function(keys, callback) {
@@ -136,6 +128,18 @@ Cache.prototype.getAll = function(keys, callback) {
 }
 
 /**
+ * Determines if the cache contains an entry for the specified key.
+ *
+ * @this {Cache}
+ * @param {Object} key Key
+ * @param {Cache~onGetAll} callback Called on finish with boolean result
+ */
+Cache.prototype.containsKey = function(key, callback) {
+    this._server.runCommand(this._createCommand("containskey").
+        setPostData(JSON.stringify({"key" : key})), callback);
+}
+
+/**
  * Execute sql query
  *
  * @param {SqlQuery|SqlFieldsQuery} qry Query
@@ -234,5 +238,13 @@ Entry.prototype.val = function() {
     return this._val;
 }
 
+/**
+ * Callback for cache get
+ *
+ * @callback Cache~onGetAll
+ * @param {string} error Error
+ * @param {string[]} results Result values
+ */
+
 exports.Cache = Cache
 exports.Entry = Entry
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/7bed77b3/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 d8f3859..8fadcc4 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
@@ -98,4 +98,18 @@ public class NodeJsCacheApiSelfTest extends NodeJsAbstractTest {
     public void testRemoveAllObjectGetAll() throws Exception {
         runJsScript("testRemoveAllObjectGetAll");
     }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testContains() throws Exception {
+        runJsScript("testContains");
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testPutContains() throws Exception {
+        runJsScript("testPutContains");
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/7bed77b3/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 fa3f6cc..afcefa3 100644
--- a/modules/nodejs/src/test/js/test-cache-api.js
+++ b/modules/nodejs/src/test/js/test-cache-api.js
@@ -26,6 +26,14 @@ testPutGet = function() {
     startTest("mycache", {trace: [put, getExist], entry: ["key" , "6"]});
 }
 
+testPutContains = function() {
+    startTest("mycache", {trace: [put, containsKey], entry: ["key" , "6"]});
+}
+
+testContains = function() {
+    startTest("mycache", {trace: [notContainsKey], entry: ["key" , "6"]});
+}
+
 testRemove = function() {
     startTest("mycache", {trace: [put, getExist, remove, getNonExist], entry: ["key" , "6"]});
 }
@@ -106,6 +114,28 @@ function put(cache, entry, next) {
     cache.put(entry[0], entry[1], next);
 }
 
+function containsKey(cache, entry, next) {
+    cache.containsKey(entry[0], onContainsKey);
+
+    function onContainsKey(err, val) {
+        assert(err === null, "Error on contains key [err=" + err + "]");
+        assert(val === true, "Incorrect result [expected=" + true + ", val=" + val + "]");
+
+        TestUtils.testDone();
+    }
+}
+
+function notContainsKey(cache, entry, next) {
+    cache.containsKey(entry[0], onContainsKey);
+
+    function onContainsKey(err, val) {
+        assert(err === null, "Error on contains key [err=" + err + "]");
+        assert(val === false, "Incorrect result [expected=" + false + ", val=" + val + "]");
+
+        TestUtils.testDone();
+    }
+}
+
 function getExist(cache, entry, next) {
     var key = Object.keys(entry)[0];
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/7bed77b3/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 b5877b6..c6fbbea 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
@@ -362,6 +362,7 @@ public class GridJettyRestHandler extends AbstractHandler {
                 break;
             }
 
+            case CACHE_CONTAINS_KEY:
             case CACHE_GET:
             case CACHE_GET_ALL:
             case CACHE_PUT:
@@ -411,7 +412,8 @@ public class GridJettyRestHandler extends AbstractHandler {
 
                         restReq0.values(map);
                     }
-                    else if (cmd == CACHE_GET || cmd == CACHE_PUT || cmd == CACHE_REMOVE) {
+                    else if (cmd == CACHE_GET || cmd == CACHE_PUT || cmd == CACHE_REMOVE ||
+                        cmd == CACHE_CONTAINS_KEY) {
                         JSONCacheObject cacheObj = new JSONCacheObject(o);
 
                         restReq0.cacheName(F.isEmpty(cacheName) ? null : cacheName);


[3/8] incubator-ignite git commit: #ignite-964: add getAndPut method for nodejs cache.

Posted by iv...@apache.org.
#ignite-964: add getAndPut 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/943d2dbc
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/943d2dbc
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/943d2dbc

Branch: refs/heads/ignite-964
Commit: 943d2dbce9b01572f434582fef4cf6efd058f0d7
Parents: 1ba51fc
Author: ivasilinets <iv...@gridgain.com>
Authored: Wed Jul 1 15:17:46 2015 +0300
Committer: ivasilinets <iv...@gridgain.com>
Committed: Wed Jul 1 15:17:46 2015 +0300

----------------------------------------------------------------------
 .../processors/rest/GridRestCommand.java        |  3 +
 .../processors/rest/GridRestProcessor.java      |  1 +
 .../handlers/cache/GridCacheCommandHandler.java | 40 ++++++++++++
 modules/nodejs/src/main/js/cache.js             | 15 ++++-
 .../ignite/internal/NodeJsCacheApiSelfTest.java |  7 ++
 modules/nodejs/src/test/js/test-cache-api.js    | 69 +++++++++-----------
 .../http/jetty/GridJettyRestHandler.java        |  3 +-
 7 files changed, 98 insertions(+), 40 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/943d2dbc/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 a6563c9..2d9a159 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
@@ -42,6 +42,9 @@ public enum GridRestCommand {
     /** Get several cached values. */
     CACHE_GET_ALL("getall"),
 
+    /** Store value in cache and return previous value. */
+    CACHE_GET_AND_PUT("getandput"),
+
     /** Store value in cache. */
     CACHE_PUT("put"),
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/943d2dbc/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 f688d3a..ee9bfce 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
@@ -548,6 +548,7 @@ public class GridRestProcessor extends GridProcessorAdapter {
             case CACHE_CAS:
             case CACHE_APPEND:
             case CACHE_PREPEND:
+            case CACHE_GET_AND_PUT:
                 perm = SecurityPermission.CACHE_PUT;
                 name = ((GridRestCacheRequest)req).cacheName();
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/943d2dbc/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 6a966ee..5d7f24a 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
@@ -56,6 +56,7 @@ public class GridCacheCommandHandler extends GridRestCommandHandlerAdapter {
         CACHE_CONTAINS_KEYS,
         CACHE_CONTAINS_KEY,
         CACHE_GET,
+        CACHE_GET_AND_PUT,
         CACHE_GET_ALL,
         CACHE_PUT,
         CACHE_ADD,
@@ -73,6 +74,7 @@ public class GridCacheCommandHandler extends GridRestCommandHandlerAdapter {
     private static final EnumSet<GridRestCommand> KEY_REQUIRED_REQUESTS = EnumSet.of(
         CACHE_CONTAINS_KEY,
         CACHE_GET,
+        CACHE_GET_AND_PUT,
         CACHE_PUT,
         CACHE_ADD,
         CACHE_REMOVE,
@@ -161,6 +163,18 @@ public class GridCacheCommandHandler extends GridRestCommandHandlerAdapter {
                     break;
                 }
 
+                case CACHE_GET_AND_PUT: {
+                    final Object val = req0.value();
+
+                    if (val == null)
+                        throw new IgniteCheckedException(GridRestCommandHandlerAdapter.missingParameter("val"));
+
+                    fut = executeCommand(req.destinationId(), req.clientId(), cacheName, skipStore, key,
+                        new GetAndPutCommand(key, val));
+
+                    break;
+                }
+
                 case CACHE_GET_ALL: {
                     fut = executeCommand(req.destinationId(), req.clientId(), cacheName, skipStore, key,
                         new GetAllCommand(getKeys(req0)));
@@ -791,6 +805,32 @@ public class GridCacheCommandHandler extends GridRestCommandHandlerAdapter {
     }
 
     /** */
+    private static class GetAndPutCommand extends CacheProjectionCommand {
+        /** */
+        private static final long serialVersionUID = 0L;
+
+        /** Key. */
+        private final Object key;
+
+        /** Value.*/
+        private final Object val;
+
+        /**
+         * @param key Key.
+         * @param val Value.
+         */
+        GetAndPutCommand(Object key, Object val) {
+            this.key = key;
+            this.val = val;
+        }
+
+        /** {@inheritDoc} */
+        @Override public IgniteInternalFuture<?> applyx(IgniteInternalCache<Object, Object> c, GridKernalContext ctx) {
+            return c.getAndPutAsync(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/943d2dbc/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 6152d57..4ac07f8 100644
--- a/modules/nodejs/src/main/js/cache.js
+++ b/modules/nodejs/src/main/js/cache.js
@@ -140,7 +140,7 @@ Cache.prototype.containsKey = function(key, callback) {
 }
 
 /**
- * Determines if the cache contains an entry for the specified key.
+ * Determines if the cache contains all keys.
  *
  * @this {Cache}
  * @param {Object[]} keys Keys
@@ -152,6 +152,19 @@ Cache.prototype.containsKeys = function(keys, callback) {
 }
 
 /**
+ * Put cache value
+ *
+ * @this {Cache}
+ * @param {string} key Key
+ * @param {string} value Value
+ * @param {onGet} callback Called on finish
+ */
+Cache.prototype.getAndPut = function(key, val, callback) {
+    this._server.runCommand(this._createCommand("getandput").
+        setPostData(JSON.stringify({"key" : key, "val" : val})), callback);
+}
+
+/**
  * Execute sql query
  *
  * @param {SqlQuery|SqlFieldsQuery} qry Query

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/943d2dbc/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 f992a7c..d79debc 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
@@ -126,4 +126,11 @@ public class NodeJsCacheApiSelfTest extends NodeJsAbstractTest {
     public void testNotContainsAll() throws Exception {
         runJsScript("testNotContainsAll");
     }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testGetAndPut() throws Exception {
+        runJsScript("testGetAndPut");
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/943d2dbc/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 5a2e9f1..904a65f 100644
--- a/modules/nodejs/src/test/js/test-cache-api.js
+++ b/modules/nodejs/src/test/js/test-cache-api.js
@@ -35,26 +35,11 @@ testContains = function() {
 }
 
 testPutContainsAll = function() {
-    entries = [];
-
-    var key1 = {"name" : "Ann"};
-    var key2 = {"name" : "Paul"};
-    var val1 = {"age" : 12, "books" : ["1", "Book"]};
-    var val2 = {"age" : 13, "books" : ["1", "Book"]};
-
-    entries.push(new Entry(key1, val1));
-    entries.push(new Entry(key2, val2));
-
-    startTest("mycache", {trace: [putAll, containsKeys], entry: entries});
+    startTest("mycache", {trace: [putAll, containsKeys], entry: objectEntries()});
 }
 
 testNotContainsAll = function() {
-    entries = [];
-
-    entries.push(new Entry("key1", "val1"));
-    entries.push(new Entry("key2", "val2"));
-
-    startTest("mycache", {trace: [notContainsKeys], entry: entries});
+    startTest("mycache", {trace: [notContainsKeys], entry: stringEntries()});
 }
 
 testRemove = function() {
@@ -66,29 +51,41 @@ testRemoveNoKey = function() {
 }
 
 testPutAllGetAll = function() {
-    entries = [];
+    startTest("mycache", {trace: [putAll, getAll], entry: stringEntries()});
+}
 
-    entries.push(new Entry("key1", "val1"));
-    entries.push(new Entry("key2", "val2"));
+testPutAllObjectGetAll = function() {
+    startTest("mycache", {trace: [putAll, getAll], entry: objectEntries()});
+}
 
-    startTest("mycache", {trace: [putAll, getAll], entry: entries});
+testRemoveAllObjectGetAll = function() {
+    startTest("mycache", {trace: [putAll, getAll, removeAll, getNone], entry: objectEntries()});
 }
 
-testPutAllObjectGetAll = function() {
-    entries = [];
+testRemoveAll = function() {
+    startTest("mycache", {trace: [putAll, getAll, removeAll, getNone], entry: stringEntries()});
+}
 
-    var key1 = {"name" : "Ann"};
-    var key2 = {"name" : "Paul"};
-    var val1 = {"age" : 12, "books" : ["1", "Book"]};
-    var val2 = {"age" : 13, "books" : ["1", "Book"]};
+testIncorrectCacheName = function() {
+    startTest("mycache1", {trace: [incorrectPut], entry: ["key", "6"]});
+}
 
-    entries.push(new Entry(key1, val1));
-    entries.push(new Entry(key2, val2));
+testGetAndPut = function() {
+    function onGetAndPut(err, res) {
+        assert(err === null, "Get error on get and put [err=" + err + "]");
+        assert(res === "6", "Incorrect result for getAndPut [expected=6, val" + res + "]");
 
-    startTest("mycache", {trace: [putAll, getAll], entry: entries});
+        TestUtils.testDone();
+    }
+
+    function getAndPut(cache, entry) {
+        cache.getAndPut("key", "7", onGetAndPut);
+    }
+
+    startTest("mycache", {trace: [put, getAndPut], entry: ["key", "6"]});
 }
 
-testRemoveAllObjectGetAll = function() {
+function objectEntries() {
     entries = [];
 
     var key1 = {"name" : "Ann"};
@@ -99,20 +96,16 @@ testRemoveAllObjectGetAll = function() {
     entries.push(new Entry(key1, val1));
     entries.push(new Entry(key2, val2));
 
-    startTest("mycache", {trace: [putAll, getAll, removeAll, getNone], entry: entries});
+    return entries;
 }
 
-testRemoveAll = function() {
+function stringEntries() {
     entries = [];
 
     entries.push(new Entry("key1", "val1"));
     entries.push(new Entry("key2", "val2"));
 
-    startTest("mycache", {trace: [putAll, getAll, removeAll, getNone], entry: entries});
-}
-
-testIncorrectCacheName = function() {
-    startTest("mycache1", {trace: [incorrectPut], entry: ["key", "6"]});
+    return entries;
 }
 
 function startTest(cacheName, testDescription) {

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/943d2dbc/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 d864713..029129b 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
@@ -366,6 +366,7 @@ public class GridJettyRestHandler extends AbstractHandler {
             case CACHE_CONTAINS_KEYS:
             case CACHE_GET:
             case CACHE_GET_ALL:
+            case CACHE_GET_AND_PUT:
             case CACHE_PUT:
             case CACHE_PUT_ALL:
             case CACHE_REMOVE:
@@ -414,7 +415,7 @@ public class GridJettyRestHandler extends AbstractHandler {
                         restReq0.values(map);
                     }
                     else if (cmd == CACHE_GET || cmd == CACHE_PUT || cmd == CACHE_REMOVE ||
-                        cmd == CACHE_CONTAINS_KEY) {
+                        cmd == CACHE_CONTAINS_KEY || cmd == CACHE_GET_AND_PUT) {
                         JSONCacheObject cacheObj = new JSONCacheObject(o);
 
                         restReq0.cacheName(F.isEmpty(cacheName) ? null : cacheName);


[5/8] incubator-ignite git commit: #ignite-964: add CACHE_GET_AND_REMOVE method for nodejs cache.

Posted by iv...@apache.org.
#ignite-964: add CACHE_GET_AND_REMOVE 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/d7faab39
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/d7faab39
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/d7faab39

Branch: refs/heads/ignite-964
Commit: d7faab397726a472e7ff0a61e13dd3e937ee656f
Parents: 16ff838
Author: ivasilinets <iv...@gridgain.com>
Authored: Wed Jul 1 15:46:32 2015 +0300
Committer: ivasilinets <iv...@gridgain.com>
Committed: Wed Jul 1 15:46:32 2015 +0300

----------------------------------------------------------------------
 .../processors/rest/GridRestCommand.java        |  3 ++
 .../processors/rest/GridRestProcessor.java      |  1 +
 .../handlers/cache/GridCacheCommandHandler.java | 29 +++++++++++++++++++-
 modules/nodejs/src/main/js/cache.js             | 13 +++++++++
 .../ignite/internal/NodeJsCacheApiSelfTest.java |  7 +++++
 modules/nodejs/src/test/js/test-cache-api.js    | 15 ++++++++++
 .../http/jetty/GridJettyRestHandler.java        |  3 +-
 7 files changed, 69 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/d7faab39/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 5a11faf..4ded850 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
@@ -60,6 +60,9 @@ public enum GridRestCommand {
     /** Remove value from cache. */
     CACHE_REMOVE("rmv"),
 
+    /** Remove value from cache. */
+    CACHE_GET_AND_REMOVE("getandrmv"),
+
     /** Remove several values from cache. */
     CACHE_REMOVE_ALL("rmvall"),
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/d7faab39/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 14811f3..e477547 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
@@ -557,6 +557,7 @@ public class GridRestProcessor extends GridProcessorAdapter {
 
             case CACHE_REMOVE:
             case CACHE_REMOVE_ALL:
+            case CACHE_GET_AND_REMOVE:
                 perm = SecurityPermission.CACHE_REMOVE;
                 name = ((GridRestCacheRequest)req).cacheName();
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/d7faab39/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 798d151..ef14582 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
@@ -63,6 +63,7 @@ public class GridCacheCommandHandler extends GridRestCommandHandlerAdapter {
         CACHE_ADD,
         CACHE_PUT_ALL,
         CACHE_REMOVE,
+        CACHE_GET_AND_REMOVE,
         CACHE_REMOVE_ALL,
         CACHE_REPLACE,
         CACHE_CAS,
@@ -80,6 +81,7 @@ public class GridCacheCommandHandler extends GridRestCommandHandlerAdapter {
         CACHE_PUT,
         CACHE_ADD,
         CACHE_REMOVE,
+        CACHE_GET_AND_REMOVE,
         CACHE_REPLACE,
         ATOMIC_INCREMENT,
         ATOMIC_DECREMENT,
@@ -250,6 +252,13 @@ public class GridCacheCommandHandler extends GridRestCommandHandlerAdapter {
                     break;
                 }
 
+                case CACHE_GET_AND_REMOVE: {
+                    fut = executeCommand(req.destinationId(), req.clientId(), cacheName, skipStore, key,
+                        new GetAndRemoveCommand(key));
+
+                    break;
+                }
+
                 case CACHE_REMOVE_ALL: {
                     Map<Object, Object> map = req0.values();
 
@@ -911,7 +920,7 @@ public class GridCacheCommandHandler extends GridRestCommandHandlerAdapter {
         private static final long serialVersionUID = 0L;
 
         /** */
-        private final Object key;
+        protected final Object key;
 
         /**
          * @param key Key.
@@ -927,6 +936,24 @@ public class GridCacheCommandHandler extends GridRestCommandHandlerAdapter {
     }
 
     /** */
+    private static class GetAndRemoveCommand extends RemoveCommand {
+        /** */
+        private static final long serialVersionUID = 0L;
+
+        /**
+         * @param key Key.
+         */
+        GetAndRemoveCommand(Object key) {
+            super(key);
+        }
+
+        /** {@inheritDoc} */
+        @Override public IgniteInternalFuture<?> applyx(IgniteInternalCache<Object, Object> c, GridKernalContext ctx) {
+            return c.getAndRemoveAsync(key);
+        }
+    }
+
+    /** */
     private static class RemoveAllCommand extends CacheProjectionCommand {
         /** */
         private static final long serialVersionUID = 0L;

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/d7faab39/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 17abd2a..169b3bc 100644
--- a/modules/nodejs/src/main/js/cache.js
+++ b/modules/nodejs/src/main/js/cache.js
@@ -74,6 +74,19 @@ Cache.prototype.remove = function(key, callback) {
 }
 
 /**
+ * Get and remove cache key
+ *
+ * @this {Cache}
+ * @param {string} key Key
+ * @param {onGet} callback Called on finish with previous value
+ */
+Cache.prototype.getAndRemove = function(key, callback) {
+    this._server.runCommand(this._createCommand("getandrmv").
+        setPostData(JSON.stringify({"key": key})),
+        callback);
+}
+
+/**
  * Remove cache keys
  *
  * @this {Cache}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/d7faab39/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 8ae8c7b..a551749 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
@@ -140,4 +140,11 @@ public class NodeJsCacheApiSelfTest extends NodeJsAbstractTest {
     public void testGetAndPutIfAbsent() throws Exception {
         runJsScript("testGetAndPutIfAbsent");
     }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testGetAndRemove() throws Exception {
+        runJsScript("testGetAndRemove");
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/d7faab39/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 9b28b4e..0840160 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"]});
 }
 
+testGetAndRemove = function() {
+    function getAndRemove(cache, entry, next) {
+        cache.getAndRemove("key", onGetAndRemove);
+
+        function onGetAndRemove(err, res) {
+            assert(err === null, "Get error on get and put [err=" + err + "]");
+            assert(res === "6", "Incorrect result for getAndPut [expected=6, val" + res + "]");
+
+            next();
+        }
+    }
+
+    startTest("mycache", {trace: [put, getAndRemove, getNone], entry: ["key", "6"]});
+}
+
 function objectEntries() {
     entries = [];
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/d7faab39/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 d190163..4b6ed55 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
@@ -371,6 +371,7 @@ public class GridJettyRestHandler extends AbstractHandler {
             case CACHE_PUT:
             case CACHE_PUT_ALL:
             case CACHE_REMOVE:
+            case CACHE_GET_AND_REMOVE:
             case CACHE_REMOVE_ALL:
             case CACHE_ADD:
             case CACHE_CAS:
@@ -417,7 +418,7 @@ 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_PUT_IF_ABSENT || cmd == CACHE_GET_AND_REMOVE) {
                         JSONCacheObject cacheObj = new JSONCacheObject(o);
 
                         restReq0.cacheName(F.isEmpty(cacheName) ? null : cacheName);


[6/8] incubator-ignite git commit: #ignite-964: add CACHE_PUT_IF_ABSENT method for nodejs cache.

Posted by iv...@apache.org.
#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 <iv...@gridgain.com>
Authored: Wed Jul 1 15:52:29 2015 +0300
Committer: ivasilinets <iv...@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);


[4/8] incubator-ignite git commit: #ignite-964: add CACHE_GET_AND_PUT_IF_ABSENT method for nodejs cache.

Posted by iv...@apache.org.
#ignite-964: add CACHE_GET_AND_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/16ff838d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/16ff838d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/16ff838d

Branch: refs/heads/ignite-964
Commit: 16ff838df8f019d81c41ea2eb884bc849a2aa4d4
Parents: 943d2db
Author: ivasilinets <iv...@gridgain.com>
Authored: Wed Jul 1 15:39:49 2015 +0300
Committer: ivasilinets <iv...@gridgain.com>
Committed: Wed Jul 1 15:39:49 2015 +0300

----------------------------------------------------------------------
 .../processors/rest/GridRestCommand.java        |  3 ++
 .../processors/rest/GridRestProcessor.java      |  1 +
 .../handlers/cache/GridCacheCommandHandler.java | 37 ++++++++++++++++++--
 modules/nodejs/src/main/js/cache.js             | 15 +++++++-
 .../ignite/internal/NodeJsCacheApiSelfTest.java |  7 ++++
 modules/nodejs/src/test/js/test-cache-api.js    | 25 +++++++++----
 .../http/jetty/GridJettyRestHandler.java        |  4 ++-
 7 files changed, 82 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/16ff838d/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 2d9a159..5a11faf 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
@@ -45,6 +45,9 @@ public enum GridRestCommand {
     /** Store value in cache and return previous value. */
     CACHE_GET_AND_PUT("getandput"),
 
+    /** Store value in cache and return previous value. */
+    CACHE_GET_AND_PUT_IF_ABSENT("getandputifabsent"),
+
     /** Store value in cache. */
     CACHE_PUT("put"),
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/16ff838d/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 ee9bfce..14811f3 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
@@ -549,6 +549,7 @@ public class GridRestProcessor extends GridProcessorAdapter {
             case CACHE_APPEND:
             case CACHE_PREPEND:
             case CACHE_GET_AND_PUT:
+            case CACHE_GET_AND_PUT_IF_ABSENT:
                 perm = SecurityPermission.CACHE_PUT;
                 name = ((GridRestCacheRequest)req).cacheName();
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/16ff838d/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 5d7f24a..798d151 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
@@ -57,6 +57,7 @@ public class GridCacheCommandHandler extends GridRestCommandHandlerAdapter {
         CACHE_CONTAINS_KEY,
         CACHE_GET,
         CACHE_GET_AND_PUT,
+        CACHE_GET_AND_PUT_IF_ABSENT,
         CACHE_GET_ALL,
         CACHE_PUT,
         CACHE_ADD,
@@ -75,6 +76,7 @@ public class GridCacheCommandHandler extends GridRestCommandHandlerAdapter {
         CACHE_CONTAINS_KEY,
         CACHE_GET,
         CACHE_GET_AND_PUT,
+        CACHE_GET_AND_PUT_IF_ABSENT,
         CACHE_PUT,
         CACHE_ADD,
         CACHE_REMOVE,
@@ -175,6 +177,18 @@ public class GridCacheCommandHandler extends GridRestCommandHandlerAdapter {
                     break;
                 }
 
+                case CACHE_GET_AND_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 GetAndPutIfAbsentCommand(key, val));
+
+                    break;
+                }
+
                 case CACHE_GET_ALL: {
                     fut = executeCommand(req.destinationId(), req.clientId(), cacheName, skipStore, key,
                         new GetAllCommand(getKeys(req0)));
@@ -810,10 +824,10 @@ public class GridCacheCommandHandler extends GridRestCommandHandlerAdapter {
         private static final long serialVersionUID = 0L;
 
         /** Key. */
-        private final Object key;
+        protected final Object key;
 
         /** Value.*/
-        private final Object val;
+        protected final Object val;
 
         /**
          * @param key Key.
@@ -831,6 +845,25 @@ public class GridCacheCommandHandler extends GridRestCommandHandlerAdapter {
     }
 
     /** */
+    private static class GetAndPutIfAbsentCommand extends GetAndPutCommand {
+        /** */
+        private static final long serialVersionUID = 0L;
+
+        /**
+         * @param key Key.
+         * @param val Value.
+         */
+        GetAndPutIfAbsentCommand(Object key, Object val) {
+            super(key, val);
+        }
+
+        /** {@inheritDoc} */
+        @Override public IgniteInternalFuture<?> applyx(IgniteInternalCache<Object, Object> c, GridKernalContext ctx) {
+            return c.getAndPutIfAbsentAsync(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/16ff838d/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 4ac07f8..17abd2a 100644
--- a/modules/nodejs/src/main/js/cache.js
+++ b/modules/nodejs/src/main/js/cache.js
@@ -152,7 +152,7 @@ Cache.prototype.containsKeys = function(keys, callback) {
 }
 
 /**
- * Put cache value
+ * Get and put cache value
  *
  * @this {Cache}
  * @param {string} key Key
@@ -165,6 +165,19 @@ Cache.prototype.getAndPut = function(key, val, callback) {
 }
 
 /**
+ * Stores given key-value pair in cache only if cache had no previous mapping for it.
+ *
+ * @this {Cache}
+ * @param {string} key Key
+ * @param {string} value Value
+ * @param {onGet} callback Called on finish
+ */
+Cache.prototype.getAndPutIfAbsent = function(key, val, callback) {
+    this._server.runCommand(this._createCommand("getandputifabsent").
+        setPostData(JSON.stringify({"key" : key, "val" : val})), callback);
+}
+
+/**
  * Execute sql query
  *
  * @param {SqlQuery|SqlFieldsQuery} qry Query

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/16ff838d/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 d79debc..8ae8c7b 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
@@ -133,4 +133,11 @@ public class NodeJsCacheApiSelfTest extends NodeJsAbstractTest {
     public void testGetAndPut() throws Exception {
         runJsScript("testGetAndPut");
     }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testGetAndPutIfAbsent() throws Exception {
+        runJsScript("testGetAndPutIfAbsent");
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/16ff838d/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 904a65f..9b28b4e 100644
--- a/modules/nodejs/src/test/js/test-cache-api.js
+++ b/modules/nodejs/src/test/js/test-cache-api.js
@@ -78,13 +78,28 @@ testGetAndPut = function() {
         TestUtils.testDone();
     }
 
-    function getAndPut(cache, entry) {
+    function getAndPut(cache, entry, next) {
         cache.getAndPut("key", "7", onGetAndPut);
     }
 
     startTest("mycache", {trace: [put, getAndPut], entry: ["key", "6"]});
 }
 
+testGetAndPutIfAbsent = function() {
+    function getAndPutIfAbsent(cache, entry, next) {
+        cache.getAndPutIfAbsent("key", "7", onGetAndPutIfAbsent);
+
+        function onGetAndPutIfAbsent(err, res) {
+            assert(err === null, "Get error on get and put [err=" + err + "]");
+            assert(res === "6", "Incorrect result for getAndPut [expected=6, val" + res + "]");
+
+            next();
+        }
+    }
+
+    startTest("mycache", {trace: [put, getAndPutIfAbsent, getExist], entry: ["key", "6"]});
+}
+
 function objectEntries() {
     entries = [];
 
@@ -187,15 +202,13 @@ function notContainsKeys(cache, entries, next) {
 }
 
 function getExist(cache, entry, next) {
-    var key = Object.keys(entry)[0];
-
-    cache.get(entry[0], onGet);
-
     function onGet(error, value) {
         assert(!error);
-        assert(value === entry[1]);
+        assert(value === entry[1], "Get incorrect value on get [exp=" + entry[1] + ", val=" + value + "]");
         next();
     }
+
+    cache.get(entry[0], onGet);
 }
 
 function remove(cache, entry, next) {

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/16ff838d/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 029129b..d190163 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_GET_AND_PUT_IF_ABSENT:
             case CACHE_PUT:
             case CACHE_PUT_ALL:
             case CACHE_REMOVE:
@@ -415,7 +416,8 @@ public class GridJettyRestHandler extends AbstractHandler {
                         restReq0.values(map);
                     }
                     else if (cmd == CACHE_GET || cmd == CACHE_PUT || cmd == CACHE_REMOVE ||
-                        cmd == CACHE_CONTAINS_KEY || cmd == CACHE_GET_AND_PUT) {
+                        cmd == CACHE_CONTAINS_KEY || cmd == CACHE_GET_AND_PUT ||
+                        cmd == CACHE_GET_AND_PUT_IF_ABSENT) {
                         JSONCacheObject cacheObj = new JSONCacheObject(o);
 
                         restReq0.cacheName(F.isEmpty(cacheName) ? null : cacheName);


[8/8] incubator-ignite git commit: #ignite-964: fix get operations.

Posted by iv...@apache.org.
#ignite-964: fix get operations.


Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/830f397d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/830f397d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/830f397d

Branch: refs/heads/ignite-964
Commit: 830f397d06d3addbbf0363d942e69013bf65897b
Parents: 61f88e8
Author: ivasilinets <iv...@gridgain.com>
Authored: Wed Jul 1 16:08:58 2015 +0300
Committer: ivasilinets <iv...@gridgain.com>
Committed: Wed Jul 1 16:08:58 2015 +0300

----------------------------------------------------------------------
 .../apache/ignite/internal/NodeJsCacheApiSelfTest.java  |  7 +++++++
 modules/nodejs/src/test/js/test-cache-api.js            | 10 +++++++++-
 .../rest/protocols/http/jetty/GridJettyRestHandler.java | 12 +++++++++---
 3 files changed, 25 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/830f397d/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 dcb0db5..596c964 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
@@ -53,6 +53,13 @@ public class NodeJsCacheApiSelfTest extends NodeJsAbstractTest {
     /**
      * @throws Exception If failed.
      */
+    public void testPutGetObject() throws Exception {
+        runJsScript("testPutGetObject");
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
     public void testIncorrectCache() throws Exception {
         runJsScript("testIncorrectCacheName");
     }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/830f397d/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 3e397bc..77b1684 100644
--- a/modules/nodejs/src/test/js/test-cache-api.js
+++ b/modules/nodejs/src/test/js/test-cache-api.js
@@ -26,6 +26,13 @@ testPutGet = function() {
     startTest("mycache", {trace: [put, getExist], entry: ["key" , "6"]});
 }
 
+testPutGetObject = function() {
+    var key = {"name" : "Paul"};
+    var val = {"age" : 12, "books" : ["1", "Book"]};
+
+    startTest("mycache", {trace: [put, getExist], entry: [key , val]});
+}
+
 testPutContains = function() {
     startTest("mycache", {trace: [put, containsKey], entry: ["key" , "6"]});
 }
@@ -249,7 +256,8 @@ function notContainsKeys(cache, entries, next) {
 function getExist(cache, entry, next) {
     function onGet(error, value) {
         assert(!error);
-        assert(value === entry[1], "Get incorrect value on get [exp=" + entry[1] + ", val=" + value + "]");
+        assert(TestUtils.compareObject(entry[1], value), "Get incorrect value on get [exp=" +
+            JSON.stringify(entry[1]) + ", val=" + JSON.stringify(value) + "]");
         next();
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/830f397d/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 cacbf19..be44916 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
@@ -320,10 +320,10 @@ public class GridJettyRestHandler extends AbstractHandler {
      * @param cmdRes Rest response.
      */
     private void createResponse(GridRestCommand cmd, GridRestResponse cmdRes) {
-        if (cmd == CACHE_GET_ALL) {
-            if (cmdRes.getResponse() == null)
-                return;
+        if (cmdRes.getResponse() == null)
+            return;
 
+        if (cmd == CACHE_GET_ALL) {
             Map o = (Map)cmdRes.getResponse();
 
             List<RestEntry> res = new ArrayList<>();
@@ -332,6 +332,12 @@ public class GridJettyRestHandler extends AbstractHandler {
                 res.add(new RestEntry(k, o.get(k)));
 
             cmdRes.setResponse(res);
+        } else if (cmd == CACHE_GET || cmd == CACHE_GET_AND_PUT ||
+            cmd == CACHE_GET_AND_PUT_IF_ABSENT || cmd == CACHE_GET_AND_REMOVE) {
+            Object o = cmdRes.getResponse();
+
+            if (o instanceof JSONCacheObject)
+                cmdRes.setResponse(((JSONCacheObject)o).getFields());
         }
     }
 


[2/8] incubator-ignite git commit: #ignite-964: add contains keys method for nodejs cache.

Posted by iv...@apache.org.
#ignite-964: add contains keys 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/1ba51fcd
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/1ba51fcd
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/1ba51fcd

Branch: refs/heads/ignite-964
Commit: 1ba51fcdcc24876dbb734fe7f8c3e8ce791889bc
Parents: 7bed77b
Author: ivasilinets <iv...@gridgain.com>
Authored: Wed Jul 1 15:00:00 2015 +0300
Committer: ivasilinets <iv...@gridgain.com>
Committed: Wed Jul 1 15:00:00 2015 +0300

----------------------------------------------------------------------
 .../processors/rest/GridRestCommand.java        |  3 +
 .../processors/rest/GridRestProcessor.java      |  2 +
 .../handlers/cache/GridCacheCommandHandler.java | 76 +++++++++++++++-----
 modules/nodejs/src/main/js/cache.js             | 12 ++++
 .../ignite/internal/NodeJsCacheApiSelfTest.java | 14 ++++
 modules/nodejs/src/test/js/test-cache-api.js    | 57 +++++++++++++++
 .../http/jetty/GridJettyRestHandler.java        |  3 +-
 7 files changed, 147 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/1ba51fcd/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 48d5bcf..a6563c9 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
@@ -36,6 +36,9 @@ public enum GridRestCommand {
     /** Contains cached value. */
     CACHE_CONTAINS_KEY("containskey"),
 
+    /** Contains cached values. */
+    CACHE_CONTAINS_KEYS("containskeys"),
+
     /** Get several cached values. */
     CACHE_GET_ALL("getall"),
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/1ba51fcd/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 220f2d1..f688d3a 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
@@ -388,6 +388,7 @@ public class GridRestProcessor extends GridProcessorAdapter {
 
         if (interceptor != null && res.getResponse() != null) {
             switch (req.command()) {
+                case CACHE_CONTAINS_KEYS:
                 case CACHE_CONTAINS_KEY:
                 case CACHE_GET:
                 case CACHE_GET_ALL:
@@ -533,6 +534,7 @@ public class GridRestProcessor extends GridProcessorAdapter {
         switch (req.command()) {
             case CACHE_GET:
             case CACHE_CONTAINS_KEY:
+            case CACHE_CONTAINS_KEYS:
             case CACHE_GET_ALL:
                 perm = SecurityPermission.CACHE_READ;
                 name = ((GridRestCacheRequest)req).cacheName();

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/1ba51fcd/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 a4dc466..6a966ee 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
@@ -53,6 +53,7 @@ import static org.apache.ignite.transactions.TransactionIsolation.*;
 public class GridCacheCommandHandler extends GridRestCommandHandlerAdapter {
     /** Supported commands. */
     private static final Collection<GridRestCommand> SUPPORTED_COMMANDS = U.sealList(
+        CACHE_CONTAINS_KEYS,
         CACHE_CONTAINS_KEY,
         CACHE_GET,
         CACHE_GET_ALL,
@@ -139,9 +140,16 @@ public class GridCacheCommandHandler extends GridRestCommandHandlerAdapter {
             IgniteInternalFuture<GridRestResponse> fut;
 
             switch (cmd) {
+                case CACHE_CONTAINS_KEYS: {
+                    fut = executeCommand(req.destinationId(), req.clientId(), cacheName, skipStore, key,
+                        new ContainsKeysCommand(getKeys(req0)));
+
+                    break;
+                }
+
                 case CACHE_CONTAINS_KEY: {
                     fut = executeCommand(req.destinationId(), req.clientId(), cacheName, skipStore, key,
-                        new ContainsCommand(key));
+                        new ContainsKeyCommand(key));
 
                     break;
                 }
@@ -154,23 +162,8 @@ public class GridCacheCommandHandler extends GridRestCommandHandlerAdapter {
                 }
 
                 case CACHE_GET_ALL: {
-                    Set<Object> keys = req0.values().keySet();
-
-                    if (F.isEmpty(keys))
-                        throw new IgniteCheckedException(GridRestCommandHandlerAdapter.missingParameter("keys"));
-
-                    // HashSet wrapping for correct serialization
-                    HashSet<Object> keys0 = new HashSet<>();
-
-                    for (Object getKey : keys) {
-                        if (getKey == null)
-                            throw new IgniteCheckedException("Failing getAll operation (null keys are not allowed).");
-
-                        keys0.add(getKey);
-                    }
-
                     fut = executeCommand(req.destinationId(), req.clientId(), cacheName, skipStore, key,
-                        new GetAllCommand(keys0));
+                        new GetAllCommand(getKeys(req0)));
 
                     break;
                 }
@@ -306,6 +299,30 @@ public class GridCacheCommandHandler extends GridRestCommandHandlerAdapter {
     }
 
     /**
+     * @param req Request.
+     * @return Request keys.
+     * @throws IgniteCheckedException If incorrect keys are presented.
+     */
+    private Set<Object> getKeys(GridRestCacheRequest req) throws IgniteCheckedException {
+        Set<Object> keys = req.values().keySet();
+
+        if (F.isEmpty(keys))
+            throw new IgniteCheckedException(GridRestCommandHandlerAdapter.missingParameter("keys"));
+
+        // HashSet wrapping for correct serialization
+        HashSet<Object> keys0 = new HashSet<>();
+
+        for (Object getKey : keys) {
+            if (getKey == null)
+                throw new IgniteCheckedException("Failing operation (null keys are not allowed).");
+
+            keys0.add(getKey);
+        }
+
+        return keys0;
+    }
+
+    /**
      * Executes command on flagged cache projection. Checks {@code destId} to find
      * if command could be performed locally or routed to a remote node.
      *
@@ -711,7 +728,7 @@ public class GridCacheCommandHandler extends GridRestCommandHandlerAdapter {
     }
 
     /** */
-    private static class ContainsCommand extends CacheProjectionCommand {
+    private static class ContainsKeyCommand extends CacheProjectionCommand {
         /** */
         private static final long serialVersionUID = 0L;
 
@@ -721,7 +738,7 @@ public class GridCacheCommandHandler extends GridRestCommandHandlerAdapter {
         /**
          * @param key Key.
          */
-        ContainsCommand(Object key) {
+        ContainsKeyCommand(Object key) {
             this.key = key;
         }
 
@@ -732,6 +749,27 @@ public class GridCacheCommandHandler extends GridRestCommandHandlerAdapter {
     }
 
     /** */
+    private static class ContainsKeysCommand extends CacheProjectionCommand {
+        /** */
+        private static final long serialVersionUID = 0L;
+
+        /** */
+        private final Collection<Object> keys;
+
+        /**
+         * @param keys Keys.
+         */
+        ContainsKeysCommand(Collection<Object> keys) {
+            this.keys = keys;
+        }
+
+        /** {@inheritDoc} */
+        @Override public IgniteInternalFuture<?> applyx(IgniteInternalCache<Object, Object> c, GridKernalContext ctx) {
+            return c.containsKeysAsync(keys);
+        }
+    }
+
+    /** */
     private static class GetCommand extends CacheProjectionCommand {
         /** */
         private static final long serialVersionUID = 0L;

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/1ba51fcd/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 2d91fcb..6152d57 100644
--- a/modules/nodejs/src/main/js/cache.js
+++ b/modules/nodejs/src/main/js/cache.js
@@ -140,6 +140,18 @@ Cache.prototype.containsKey = function(key, callback) {
 }
 
 /**
+ * Determines if the cache contains an entry for the specified key.
+ *
+ * @this {Cache}
+ * @param {Object[]} keys Keys
+ * @param {Cache~onGetAll} callback Called on finish with boolean result
+ */
+Cache.prototype.containsKeys = function(keys, callback) {
+    this._server.runCommand(this._createCommand("containskeys").
+        setPostData(JSON.stringify({"keys" : keys})), callback);
+}
+
+/**
  * Execute sql query
  *
  * @param {SqlQuery|SqlFieldsQuery} qry Query

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/1ba51fcd/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 8fadcc4..f992a7c 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
@@ -112,4 +112,18 @@ public class NodeJsCacheApiSelfTest extends NodeJsAbstractTest {
     public void testPutContains() throws Exception {
         runJsScript("testPutContains");
     }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testPutContainsAll() throws Exception {
+        runJsScript("testPutContainsAll");
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testNotContainsAll() throws Exception {
+        runJsScript("testNotContainsAll");
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/1ba51fcd/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 afcefa3..5a2e9f1 100644
--- a/modules/nodejs/src/test/js/test-cache-api.js
+++ b/modules/nodejs/src/test/js/test-cache-api.js
@@ -34,6 +34,29 @@ testContains = function() {
     startTest("mycache", {trace: [notContainsKey], entry: ["key" , "6"]});
 }
 
+testPutContainsAll = function() {
+    entries = [];
+
+    var key1 = {"name" : "Ann"};
+    var key2 = {"name" : "Paul"};
+    var val1 = {"age" : 12, "books" : ["1", "Book"]};
+    var val2 = {"age" : 13, "books" : ["1", "Book"]};
+
+    entries.push(new Entry(key1, val1));
+    entries.push(new Entry(key2, val2));
+
+    startTest("mycache", {trace: [putAll, containsKeys], entry: entries});
+}
+
+testNotContainsAll = function() {
+    entries = [];
+
+    entries.push(new Entry("key1", "val1"));
+    entries.push(new Entry("key2", "val2"));
+
+    startTest("mycache", {trace: [notContainsKeys], entry: entries});
+}
+
 testRemove = function() {
     startTest("mycache", {trace: [put, getExist, remove, getNonExist], entry: ["key" , "6"]});
 }
@@ -136,6 +159,40 @@ function notContainsKey(cache, entry, next) {
     }
 }
 
+function containsKeys(cache, entries, next) {
+    var keys = []
+
+    for (var entry of entries) {
+        keys.push(entry.key());
+    }
+
+    cache.containsKeys(keys, onContainsKeys);
+
+    function onContainsKeys(err, val) {
+        assert(err === null, "Error on contains key [err=" + err + "]");
+        assert(val === true, "Incorrect result [expected=" + true + ", val=" + val + "]");
+
+        TestUtils.testDone();
+    }
+}
+
+function notContainsKeys(cache, entries, next) {
+    var keys = []
+
+    for (var entry of entries) {
+        keys.push(entry.key());
+    }
+
+    cache.containsKeys(keys, onContainsKeys);
+
+    function onContainsKeys(err, val) {
+        assert(err === null, "Error on contains key [err=" + err + "]");
+        assert(val === false, "Incorrect result [expected=" + false + ", val=" + val + "]");
+
+        TestUtils.testDone();
+    }
+}
+
 function getExist(cache, entry, next) {
     var key = Object.keys(entry)[0];
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/1ba51fcd/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 c6fbbea..d864713 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
@@ -363,6 +363,7 @@ public class GridJettyRestHandler extends AbstractHandler {
             }
 
             case CACHE_CONTAINS_KEY:
+            case CACHE_CONTAINS_KEYS:
             case CACHE_GET:
             case CACHE_GET_ALL:
             case CACHE_PUT:
@@ -400,7 +401,7 @@ public class GridJettyRestHandler extends AbstractHandler {
 
                         restReq0.values(map);
                     }
-                    else if (cmd == CACHE_GET_ALL || cmd == CACHE_REMOVE_ALL) {
+                    else if (cmd == CACHE_GET_ALL || cmd == CACHE_REMOVE_ALL || cmd == CACHE_CONTAINS_KEYS) {
                         JSONCacheObject cacheObj = new JSONCacheObject(o);
 
                         List keys = (List)cacheObj.getField("keys");


[7/8] incubator-ignite git commit: #ignite-964: add CACHE_REMOVE_VALUE method for nodejs cache.

Posted by iv...@apache.org.
#ignite-964: add CACHE_REMOVE_VALUE 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/61f88e8f
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/61f88e8f
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/61f88e8f

Branch: refs/heads/ignite-964
Commit: 61f88e8fd8c50aba12c2b884287e28efef2f76f5
Parents: d44d7f2
Author: ivasilinets <iv...@gridgain.com>
Authored: Wed Jul 1 16:00:47 2015 +0300
Committer: ivasilinets <iv...@gridgain.com>
Committed: Wed Jul 1 16:00:47 2015 +0300

----------------------------------------------------------------------
 .../processors/rest/GridRestCommand.java        |  3 +
 .../processors/rest/GridRestProcessor.java      |  1 +
 .../handlers/cache/GridCacheCommandHandler.java | 78 ++++++++++++--------
 modules/nodejs/src/main/js/cache.js             | 16 +++-
 .../ignite/internal/NodeJsCacheApiSelfTest.java |  7 ++
 modules/nodejs/src/test/js/test-cache-api.js    | 19 ++++-
 .../http/jetty/GridJettyRestHandler.java        |  3 +-
 7 files changed, 92 insertions(+), 35 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/61f88e8f/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 b8f05bf..86237b8 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
@@ -64,6 +64,9 @@ public enum GridRestCommand {
     CACHE_REMOVE("rmv"),
 
     /** Remove value from cache. */
+    CACHE_REMOVE_VALUE("rmvvalue"),
+
+    /** Remove value from cache. */
     CACHE_GET_AND_REMOVE("getandrmv"),
 
     /** Remove several values from cache. */

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/61f88e8f/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 b524e92..a19fde7 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
@@ -559,6 +559,7 @@ public class GridRestProcessor extends GridProcessorAdapter {
             case CACHE_REMOVE:
             case CACHE_REMOVE_ALL:
             case CACHE_GET_AND_REMOVE:
+            case CACHE_REMOVE_VALUE:
                 perm = SecurityPermission.CACHE_REMOVE;
                 name = ((GridRestCacheRequest)req).cacheName();
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/61f88e8f/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 b5b59fc..6db6c23 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
@@ -64,6 +64,7 @@ public class GridCacheCommandHandler extends GridRestCommandHandlerAdapter {
         CACHE_ADD,
         CACHE_PUT_ALL,
         CACHE_REMOVE,
+        CACHE_REMOVE_VALUE,
         CACHE_GET_AND_REMOVE,
         CACHE_REMOVE_ALL,
         CACHE_REPLACE,
@@ -83,6 +84,7 @@ public class GridCacheCommandHandler extends GridRestCommandHandlerAdapter {
         CACHE_PUT,
         CACHE_ADD,
         CACHE_REMOVE,
+        CACHE_REMOVE_VALUE,
         CACHE_GET_AND_REMOVE,
         CACHE_REPLACE,
         ATOMIC_INCREMENT,
@@ -170,38 +172,22 @@ public class GridCacheCommandHandler extends GridRestCommandHandlerAdapter {
                 }
 
                 case CACHE_GET_AND_PUT: {
-                    final Object val = req0.value();
-
-                    if (val == null)
-                        throw new IgniteCheckedException(GridRestCommandHandlerAdapter.missingParameter("val"));
-
                     fut = executeCommand(req.destinationId(), req.clientId(), cacheName, skipStore, key,
-                        new GetAndPutCommand(key, val));
+                        new GetAndPutCommand(key, getValue(req0)));
 
                     break;
                 }
 
                 case CACHE_GET_AND_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 GetAndPutIfAbsentCommand(key, val));
+                        new GetAndPutIfAbsentCommand(key, getValue(req0)));
 
                     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));
+                        new PutIfAbsentCommand(key, getValue(req0)));
 
                     break;
                 }
@@ -214,25 +200,15 @@ public class GridCacheCommandHandler extends GridRestCommandHandlerAdapter {
                 }
 
                 case CACHE_PUT: {
-                    final Object val = req0.value();
-
-                    if (val == null)
-                        throw new IgniteCheckedException(GridRestCommandHandlerAdapter.missingParameter("val"));
-
                     fut = executeCommand(req.destinationId(), req.clientId(), cacheName, skipStore, key, new
-                        PutCommand(key, ttl, val));
+                        PutCommand(key, ttl, getValue(req0)));
 
                     break;
                 }
 
                 case CACHE_ADD: {
-                    final Object val = req0.value();
-
-                    if (val == null)
-                        throw new IgniteCheckedException(GridRestCommandHandlerAdapter.missingParameter("val"));
-
                     fut = executeCommand(req.destinationId(), req.clientId(), cacheName, skipStore, key,
-                        new AddCommand(key, ttl, val));
+                        new AddCommand(key, ttl, getValue(req0)));
 
                     break;
                 }
@@ -267,6 +243,13 @@ public class GridCacheCommandHandler extends GridRestCommandHandlerAdapter {
                     break;
                 }
 
+                case CACHE_REMOVE_VALUE: {
+                    fut = executeCommand(req.destinationId(), req.clientId(), cacheName, skipStore, key,
+                        new RemoveValueCommand(key, getValue(req0)));
+
+                    break;
+                }
+
                 case CACHE_GET_AND_REMOVE: {
                     fut = executeCommand(req.destinationId(), req.clientId(), cacheName, skipStore, key,
                         new GetAndRemoveCommand(key));
@@ -375,6 +358,20 @@ public class GridCacheCommandHandler extends GridRestCommandHandlerAdapter {
     }
 
     /**
+     * @param req Request.
+     * @return Request value.
+     * @throws IgniteCheckedException If incorrect keys are presented.
+     */
+    private Object getValue(GridRestCacheRequest req) throws IgniteCheckedException {
+        final Object val = req.value();
+
+        if (val == null)
+            throw new IgniteCheckedException(GridRestCommandHandlerAdapter.missingParameter("val"));
+
+        return val;
+    }
+
+    /**
      * Executes command on flagged cache projection. Checks {@code destId} to find
      * if command could be performed locally or routed to a remote node.
      *
@@ -970,6 +967,25 @@ public class GridCacheCommandHandler extends GridRestCommandHandlerAdapter {
     }
 
     /** */
+    private static class RemoveValueCommand extends GetAndPutCommand {
+        /** */
+        private static final long serialVersionUID = 0L;
+
+        /**
+         * @param key Key.
+         * @param val Value.
+         */
+        RemoveValueCommand(Object key, Object val) {
+            super(key, val);
+        }
+
+        /** {@inheritDoc} */
+        @Override public IgniteInternalFuture<?> applyx(IgniteInternalCache<Object, Object> c, GridKernalContext ctx) {
+            return c.removeAsync(key, val);
+        }
+    }
+
+    /** */
     private static class GetAndRemoveCommand extends RemoveCommand {
         /** */
         private static final long serialVersionUID = 0L;

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/61f88e8f/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 9184154..57f1f79 100644
--- a/modules/nodejs/src/main/js/cache.js
+++ b/modules/nodejs/src/main/js/cache.js
@@ -78,7 +78,7 @@ Cache.prototype.putIfAbsent = function(key, value, callback) {
  * Remove cache key
  *
  * @this {Cache}
- * @param {string} key Key
+ * @param key Key
  * @param {noValue} callback Called on finish
  */
 Cache.prototype.remove = function(key, callback) {
@@ -88,6 +88,20 @@ Cache.prototype.remove = function(key, callback) {
 }
 
 /**
+ * Remove cache key
+ *
+ * @this {Cache}
+ * @param key Key
+ * @param value Value
+ * @param {noValue} callback Called on finish
+ */
+Cache.prototype.removeValue = function(key, value, callback) {
+    this._server.runCommand(this._createCommand("rmvvalue").
+        setPostData(JSON.stringify({"key": key, "val" : value})),
+        callback);
+}
+
+/**
  * Get and remove cache key
  *
  * @this {Cache}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/61f88e8f/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 201cc3d..dcb0db5 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
@@ -154,4 +154,11 @@ public class NodeJsCacheApiSelfTest extends NodeJsAbstractTest {
     public void testGetAndRemove() throws Exception {
         runJsScript("testGetAndRemove");
     }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testRemoveValue() throws Exception {
+        runJsScript("testRemoveValue");
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/61f88e8f/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 466518d..3e397bc 100644
--- a/modules/nodejs/src/test/js/test-cache-api.js
+++ b/modules/nodejs/src/test/js/test-cache-api.js
@@ -91,7 +91,7 @@ testGetAndPutIfAbsent = function() {
 
         function onGetAndPutIfAbsent(err, res) {
             assert(err === null, "Get error on get and put [err=" + err + "]");
-            assert(res === "6", "Incorrect result for getAndPut [expected=6, val" + res + "]");
+            assert(res === "6", "Incorrect result for getAndPutIfAbsent [expected=6, val" + res + "]");
 
             next();
         }
@@ -106,7 +106,7 @@ testPutIfAbsent = function() {
 
         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 + "]");
+            assert(res === false, "Incorrect result for putIfAbsent [expected=false, val" + res + "]");
 
             next();
         }
@@ -115,6 +115,21 @@ testPutIfAbsent = function() {
     startTest("mycache", {trace: [put, putIfAbsent, getExist], entry: ["key", "6"]});
 }
 
+testRemoveValue = function() {
+    function removeValue(cache, entry, next) {
+        cache.removeValue("key", "7", onRemoveValue);
+
+        function onRemoveValue(err, res) {
+            assert(err === null, "Get error on get and put [err=" + err + "]");
+            assert(res === false, "Incorrect result for onRemoveValue [expected=false, val" + res + "]");
+
+            next();
+        }
+    }
+
+    startTest("mycache", {trace: [put, removeValue, 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/61f88e8f/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 0574786..cacbf19 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
@@ -372,6 +372,7 @@ public class GridJettyRestHandler extends AbstractHandler {
             case CACHE_PUT:
             case CACHE_PUT_ALL:
             case CACHE_REMOVE:
+            case CACHE_REMOVE_VALUE:
             case CACHE_GET_AND_REMOVE:
             case CACHE_REMOVE_ALL:
             case CACHE_ADD:
@@ -420,7 +421,7 @@ 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_PUT_IF_ABSENT) {
+                        cmd == CACHE_PUT_IF_ABSENT || cmd == CACHE_REMOVE_VALUE) {
                         JSONCacheObject cacheObj = new JSONCacheObject(o);
 
                         restReq0.cacheName(F.isEmpty(cacheName) ? null : cacheName);