// Copyright 2011 Google Inc. All Rights Reserved. package com.google.appengine.tools.pipeline.demo; import com.google.appengine.tools.pipeline.FutureValue; import com.google.appengine.tools.pipeline.Job0; import com.google.appengine.tools.pipeline.Job1; import com.google.appengine.tools.pipeline.Job2; import com.google.appengine.tools.pipeline.Job3; import com.google.appengine.tools.pipeline.PromisedValue; import com.google.appengine.tools.pipeline.Value; /** * This class contains the example Pipelines from the User Guide * * @author rudominer@google.com (Mitch Rudominer) */ public class UserGuideExamples { /** * Job to calculate (x - y) * (x - z) - 2 */ public static class ComplexJob extends Job3<Integer, Integer, Integer, Integer> { private static final long serialVersionUID = -3659971121199420049L; @Override public Value<Integer> run(Integer x, Integer y, Integer z) { DiffJob diffJob = new DiffJob(); MultJob multJob = new MultJob(); FutureValue<Integer> r = futureCall(diffJob, immediate(x), immediate(y)); FutureValue<Integer> s = futureCall(diffJob, immediate(x), immediate(z)); FutureValue<Integer> t = futureCall(multJob, r, s); FutureValue<Integer> u = futureCall(diffJob, t, immediate(2)); return u; } } /** * Job for calculating x - y. */ public static class DiffJob extends Job2<Integer, Integer, Integer> { private static final long serialVersionUID = -623601952335794286L; @Override public Value<Integer> run(Integer a, Integer b) { return immediate(a - b); } } /** * Job for calculating x * y */ public static class MultJob extends Job2<Integer, Integer, Integer> { private static final long serialVersionUID = -3272045240539122024L; @Override public Value<Integer> run(Integer a, Integer b) { return immediate(a * b); } } /** * An example job that consumes data from external-source/user. */ public static class ExternalAgentJob extends Job1<Integer, String> { private static final long serialVersionUID = -8312140484895836265L; @Override public Value<Integer> run(String userEmail) { // Invoke ComplexJob on three promised values PromisedValue<Integer> x = newPromise(); PromisedValue<Integer> y = newPromise(); PromisedValue<Integer> z = newPromise(); FutureValue<Integer> intermediate = futureCall(new ComplexJob(), x, y, z); // Kick off the process of retrieving the data from the external agent getIntFromUser("Please give 1st int", userEmail, x.getHandle()); getIntFromUser("Please give 2nd int", userEmail, y.getHandle()); getIntFromUser("Please give 3rd int", userEmail, z.getHandle()); // Send the user the intermediate result and ask for one more integer FutureValue<Integer> oneMoreInt = futureCall(new PromptJob(), intermediate, immediate(userEmail)); // Invoke MultJob on intermediate and oneMoreInt return futureCall(new MultJob(), intermediate, oneMoreInt); } @SuppressWarnings("unused") public static void getIntFromUser( String prompt, String userEmail, String promiseHandle) { // 1. Send the user an e-mail containing the prompt. // 2. Ask user to submit one more integer on some web page. // 3. promiseHandle is a query string argument // 4. Handler for submit invokes submitPromisedValue(promiseHandle, value) } } /** * A job that fills a promised value by ExternalAgentJob. */ public static class PromptJob extends Job2<Integer, Integer, String> { private static final long serialVersionUID = -1556508205879799996L; @Override public Value<Integer> run(Integer intermediate, String userEmail) { String prompt = "The intermediate result is " + intermediate + "." + " Please give one more int"; PromisedValue<Integer> oneMoreInt = newPromise(); ExternalAgentJob.getIntFromUser(prompt, userEmail, oneMoreInt.getHandle()); return oneMoreInt; } } /** * An example for a generator job that creates 2 child jobs that run sequentially. */ public static class ExampleWaitForJob extends Job0<Void> { private static final long serialVersionUID = 2902489882639841399L; @Override public Value<Void> run() { FutureValue<Void> a = futureCall(new JobA()); futureCall(new JobB(), waitFor(a)); return null; } } /** * Dummy job. */ public static class JobA extends Job0<Void> { private static final long serialVersionUID = 2566124209015132825L; @Override public Value<Void> run() { //Do something... return null; } } /** * Dummy job. */ public static class JobB extends Job0<Void> { private static final long serialVersionUID = 8128100793415469657L; @Override public Value<Void> run() { // Do something... return null; } } }