You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sb...@apache.org on 2015/06/24 14:48:39 UTC
[4/7] incubator-ignite git commit: #ignite-965: emit is a global
function.
#ignite-965: emit is a global function.
Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/e8377811
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/e8377811
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/e8377811
Branch: refs/heads/ignite-965
Commit: e8377811f02969cf905a61f772cc0727669516ec
Parents: 53e5be7
Author: ivasilinets <iv...@gridgain.com>
Authored: Wed Jun 24 15:29:32 2015 +0300
Committer: ivasilinets <iv...@gridgain.com>
Committed: Wed Jun 24 15:29:32 2015 +0300
----------------------------------------------------------------------
.../handlers/scripting/IgniteJsEmitResult.java | 57 ++++++++++++++++++++
.../IgniteScriptingCommandHandler.java | 35 ++++++++----
.../scripting/IgniteScriptProcessor.java | 14 +++++
modules/nodejs/src/test/js/test-compute.js | 2 +-
4 files changed, 96 insertions(+), 12 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e8377811/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/scripting/IgniteJsEmitResult.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/scripting/IgniteJsEmitResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/scripting/IgniteJsEmitResult.java
new file mode 100644
index 0000000..ecd6cba
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/scripting/IgniteJsEmitResult.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.rest.handlers.scripting;
+
+import org.apache.ignite.internal.util.typedef.*;
+
+import java.util.*;
+
+/**
+ * Emit result binding.
+ */
+public class IgniteJsEmitResult {
+ /** Thread local emit result.*/
+ private ThreadLocal<List<T3<Object, Object, Object>>> emitResPerCall = new ThreadLocal<>();
+
+ /**
+ * @param f JS function.
+ * @param args Function arguments.
+ * @param node Node.
+ */
+ public void add(Object f, Object args, Object node) {
+ List<T3<Object, Object, Object>> res = emitResPerCall.get();
+
+ if (res == null)
+ res = new ArrayList();
+
+ res.add(new T3(f, args, node));
+
+ emitResPerCall.set(res);
+ }
+
+ /**
+ * @return Emit result.
+ */
+ public List<T3<Object, Object, Object>> getEmitResult() {
+ List<T3<Object, Object, Object>> res = emitResPerCall.get();
+
+ emitResPerCall.set(null);
+
+ return res;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e8377811/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/scripting/IgniteScriptingCommandHandler.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/scripting/IgniteScriptingCommandHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/scripting/IgniteScriptingCommandHandler.java
index 54dffe2..edf9826 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/scripting/IgniteScriptingCommandHandler.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/scripting/IgniteScriptingCommandHandler.java
@@ -26,6 +26,7 @@ import org.apache.ignite.internal.processors.rest.handlers.*;
import org.apache.ignite.internal.processors.rest.request.*;
import org.apache.ignite.internal.processors.scripting.*;
import org.apache.ignite.internal.util.future.*;
+import org.apache.ignite.internal.util.typedef.*;
import org.apache.ignite.internal.util.typedef.internal.*;
import org.apache.ignite.lang.*;
import org.apache.ignite.resources.*;
@@ -44,6 +45,9 @@ public class IgniteScriptingCommandHandler extends GridRestCommandHandlerAdapter
EXECUTE_MAP_REDUCE_SCRIPT,
RUN_SCRIPT);
+ /** Emit result. */
+ private IgniteJsEmitResult emitRes;
+
/**
* @param ctx Context.
*/
@@ -53,17 +57,20 @@ public class IgniteScriptingCommandHandler extends GridRestCommandHandlerAdapter
try {
IgniteScriptProcessor script = ctx.scripting();
- String emitFunction = "function emit(result, f, args, nodeId) {result.push([f.toString(), args, nodeId])}";
+ String emitFunction = "function emit(f, args, nodeId) {" +
+ "__emitResult.add(f.toString(), args, nodeId);}";
String computeFunction = "function __compute(mapFuncSource, ids, args) {" +
- " var res = [];" +
" var f = __createJSFunction(mapFuncSource);" +
- " f(ids, args, emit.bind(null, res)); " +
- " return res;" +
+ " f(ids, args); " +
" }";
script.addEngineFunction(emitFunction);
script.addEngineFunction(computeFunction);
+
+ emitRes = new IgniteJsEmitResult();
+
+ script.addBinding("__emitResult", emitRes);
}
catch (IgniteCheckedException e) {
ctx.log().error(e.getMessage());
@@ -101,7 +108,8 @@ public class IgniteScriptingCommandHandler extends GridRestCommandHandlerAdapter
final RestMapReduceScriptRequest req0 = (RestMapReduceScriptRequest) req;
GridRestResponse res = ctx.grid().compute().execute(
- new JsTask(req0.mapFunction(), req0.argument(), req0.reduceFunction(), ctx), null);
+ new JsTask(req0.mapFunction(), req0.argument(), req0.reduceFunction(), ctx, emitRes),
+ null);
return new GridFinishedFuture<>(res);
}
@@ -129,17 +137,21 @@ public class IgniteScriptingCommandHandler extends GridRestCommandHandlerAdapter
/** Map function argument. */
private String arg;
+ /** Emit results. */
+ private IgniteJsEmitResult emitRes;
+
/**
* @param mapFunc Map function.
* @param arg Map function argument.
* @param reduceFunc Reduce function.
* @param ctx Kernal context.
*/
- public JsTask(String mapFunc, String arg, String reduceFunc, GridKernalContext ctx) {
+ public JsTask(String mapFunc, String arg, String reduceFunc, GridKernalContext ctx, IgniteJsEmitResult emitRes) {
this.mapFunc = mapFunc;
this.reduceFunc = reduceFunc;
this.arg = arg;
this.ctx = ctx;
+ this.emitRes = emitRes;
}
/** {@inheritDoc} */
@@ -147,14 +159,15 @@ public class IgniteScriptingCommandHandler extends GridRestCommandHandlerAdapter
try {
Map<ComputeJob, ClusterNode> map = new HashMap<>();
- List jsMapRes = (List)ctx.scripting().invokeFunctionByName("__compute",
+ ctx.scripting().invokeFunctionByName("__compute",
mapFunc, nodes.toArray(new ClusterNode[nodes.size()]), this.arg);
- for (Object jobMapping : jsMapRes) {
- List task = (List)jobMapping;
+ List<T3<Object, Object, Object>> jsMapRes = emitRes.getEmitResult();
+
+ for (T3<Object, Object, Object> task : jsMapRes) {
- map.put(new JsCallFunctionJob((String)task.get(0), task.get(1)),
- (ClusterNode)task.get(2));
+ map.put(new JsCallFunctionJob((String)task.get1(), task.get2()),
+ (ClusterNode)task.get3());
}
return map;
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e8377811/modules/core/src/main/java/org/apache/ignite/internal/processors/scripting/IgniteScriptProcessor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/scripting/IgniteScriptProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/scripting/IgniteScriptProcessor.java
index 9843bc3..5073427 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/scripting/IgniteScriptProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/scripting/IgniteScriptProcessor.java
@@ -84,6 +84,20 @@ public class IgniteScriptProcessor extends GridProcessorAdapter {
}
/**
+ * Add binding.
+ *
+ * @param name Binding name.
+ * @param o Object to bind.
+ */
+ public void addBinding(String name, Object o) {
+ Bindings b = jsEngine.getBindings(ENGINE_SCOPE);
+
+ b.put(name, o);
+
+ jsEngine.setBindings(b, ENGINE_SCOPE);
+ }
+
+ /**
* @param src Script src.
* @param args Arguments.
* @return Result of the function.
http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/e8377811/modules/nodejs/src/test/js/test-compute.js
----------------------------------------------------------------------
diff --git a/modules/nodejs/src/test/js/test-compute.js b/modules/nodejs/src/test/js/test-compute.js
index 0fe7842..6aad0c6 100644
--- a/modules/nodejs/src/test/js/test-compute.js
+++ b/modules/nodejs/src/test/js/test-compute.js
@@ -57,7 +57,7 @@ function computeRunScript(ignite, error) {
}
function computeExecute(error, ignite) {
- var map = function(nodes, arg, emit) {
+ var map = function(nodes, arg) {
var words = arg.split(" ");
for (var i = 0; i < words.length; i++) {