Author: gates
Date: Fri Dec 18 23:15:57 2009
New Revision: 892396
URL: http://svn.apache.org/viewvc?rev=892396&view=rev
Log:
PIG-1156 Add aliases to ExecJobs and PhysicalOperators.
Added:
hadoop/pig/trunk/test/org/apache/pig/test/TestBatchAliases.java
Modified:
hadoop/pig/trunk/CHANGES.txt
hadoop/pig/trunk/src/org/apache/pig/backend/executionengine/ExecJob.java
hadoop/pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/HExecutionEngine.java
hadoop/pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/HJob.java
hadoop/pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/LogToPhyTranslationVisitor.java
hadoop/pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/PhysicalOperator.java
hadoop/pig/trunk/src/org/apache/pig/backend/local/executionengine/LocalJob.java
hadoop/pig/trunk/test/org/apache/pig/test/data/GoldenFiles/MRC18.gld
Modified: hadoop/pig/trunk/CHANGES.txt
URL:
http://svn.apache.org/viewvc/hadoop/pig/trunk/CHANGES.txt?rev=892396&r1=892395&r2=892396&view=diff
==============================================================================
--- hadoop/pig/trunk/CHANGES.txt (original)
+++ hadoop/pig/trunk/CHANGES.txt Fri Dec 18 23:15:57 2009
@@ -24,6 +24,8 @@
IMPROVEMENTS
+PIG-1156: Add aliases to ExecJobs and PhysicalOperators (dvryaboy via gates)
+
PIG-1161: add missing license headers (dvryaboy via olgan)
PIG-965: PERFORMANCE: optimize common case in matches (PORegex) (ankit.modi
Modified:
hadoop/pig/trunk/src/org/apache/pig/backend/executionengine/ExecJob.java
URL:
http://svn.apache.org/viewvc/hadoop/pig/trunk/src/org/apache/pig/backend/executionengine/ExecJob.java?rev=892396&r1=892395&r2=892396&view=diff
==============================================================================
--- hadoop/pig/trunk/src/org/apache/pig/backend/executionengine/ExecJob.java
(original)
+++ hadoop/pig/trunk/src/org/apache/pig/backend/executionengine/ExecJob.java
Fri Dec 18 23:15:57 2009
@@ -66,6 +66,11 @@
public Iterator<Tuple> getResults() throws ExecException;
/**
+ * Returns the alias of relation generated by this job
+ */
+ public String getAlias() throws ExecException;
+
+ /**
* Get configuration information
*
* @return configuration information for the execution engine
Modified:
hadoop/pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/HExecutionEngine.java
URL:
http://svn.apache.org/viewvc/hadoop/pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/HExecutionEngine.java?rev=892396&r1=892395&r2=892396&view=diff
==============================================================================
---
hadoop/pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/HExecutionEngine.java
(original)
+++
hadoop/pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/HExecutionEngine.java
Fri Dec 18 23:15:57 2009
@@ -51,9 +51,11 @@
import org.apache.pig.impl.io.FileSpec;
import org.apache.pig.impl.logicalLayer.LogicalPlan;
import
org.apache.pig.backend.hadoop.executionengine.physicalLayer.LogToPhyTranslationVisitor;
+import
org.apache.pig.backend.hadoop.executionengine.physicalLayer.PhysicalOperator;
import org.apache.pig.impl.plan.OperatorKey;
import
org.apache.pig.backend.hadoop.executionengine.mapReduceLayer.MapReduceLauncher;
import
org.apache.pig.backend.hadoop.executionengine.physicalLayer.plans.PhysicalPlan;
+import
org.apache.pig.backend.hadoop.executionengine.physicalLayer.relationalOperators.POStore;
import org.apache.pig.impl.plan.VisitorException;
import org.apache.pig.tools.pigstats.PigStats;
@@ -238,15 +240,26 @@
MapReduceLauncher launcher = new MapReduceLauncher();
List<ExecJob> jobs = new ArrayList<ExecJob>();
+ Map<String, PhysicalOperator> leafMap = new HashMap<String,
PhysicalOperator>();
+ for (PhysicalOperator physOp : plan.getLeaves()) {
+ log.info(physOp);
+ if (physOp instanceof POStore) {
+ FileSpec spec = ((POStore) physOp).getSFile();
+ if (spec != null)
+ leafMap.put(spec.toString(), physOp);
+ }
+ }
try {
PigStats stats = launcher.launchPig(plan, jobName, pigContext);
for (FileSpec spec: launcher.getSucceededFiles()) {
- jobs.add(new HJob(ExecJob.JOB_STATUS.COMPLETED, pigContext,
spec, stats));
+ String alias = leafMap.containsKey(spec.toString()) ?
leafMap.get(spec.toString()).getAlias() : null;
+ jobs.add(new HJob(ExecJob.JOB_STATUS.COMPLETED, pigContext,
spec, alias, stats));
}
for (FileSpec spec: launcher.getFailedFiles()) {
- HJob j = new HJob(ExecJob.JOB_STATUS.FAILED, pigContext, spec,
stats);
+ String alias = leafMap.containsKey(spec.toString()) ?
leafMap.get(spec.toString()).getAlias() : null;
+ HJob j = new HJob(ExecJob.JOB_STATUS.FAILED, pigContext, spec,
alias, stats);
j.setException(launcher.getError(spec));
jobs.add(j);
}
Modified:
hadoop/pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/HJob.java
URL:
http://svn.apache.org/viewvc/hadoop/pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/HJob.java?rev=892396&r1=892395&r2=892396&view=diff
==============================================================================
---
hadoop/pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/HJob.java
(original)
+++
hadoop/pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/HJob.java
Fri Dec 18 23:15:57 2009
@@ -46,23 +46,28 @@
protected PigContext pigContext;
protected FileSpec outFileSpec;
protected Exception backendException;
+ protected String alias;
private PigStats stats;
public HJob(JOB_STATUS status,
PigContext pigContext,
- FileSpec outFileSpec) {
+ FileSpec outFileSpec,
+ String alias) {
this.status = status;
this.pigContext = pigContext;
this.outFileSpec = outFileSpec;
+ this.alias = alias;
}
public HJob(JOB_STATUS status,
PigContext pigContext,
FileSpec outFileSpec,
+ String alias,
PigStats stats) {
this.status = status;
this.pigContext = pigContext;
this.outFileSpec = outFileSpec;
+ this.alias = alias;
this.stats = stats;
}
@@ -170,4 +175,9 @@
public Exception getException() {
return backendException;
}
+
+ @Override
+ public String getAlias() throws ExecException {
+ return alias;
+ }
}
Modified:
hadoop/pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/LogToPhyTranslationVisitor.java
URL:
http://svn.apache.org/viewvc/hadoop/pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/LogToPhyTranslationVisitor.java?rev=892396&r1=892395&r2=892396&view=diff
==============================================================================
---
hadoop/pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/LogToPhyTranslationVisitor.java
(original)
+++
hadoop/pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/LogToPhyTranslationVisitor.java
Fri Dec 18 23:15:57 2009
@@ -102,6 +102,7 @@
BinaryComparisonOperator exprOp = new GreaterThanExpr(new OperatorKey(
scope, nodeGen.getNextNodeId(scope)), op
.getRequestedParallelism());
+ exprOp.setAlias(op.getAlias());
exprOp.setOperandType(op.getLhsOperand().getType());
exprOp.setLhs((ExpressionOperator)
logToPhyMap.get(op.getLhsOperand()));
exprOp.setRhs((ExpressionOperator)
logToPhyMap.get(op.getRhsOperand()));
@@ -133,6 +134,7 @@
BinaryComparisonOperator exprOp = new LessThanExpr(new OperatorKey(
scope, nodeGen.getNextNodeId(scope)), op
.getRequestedParallelism());
+ exprOp.setAlias(op.getAlias());
exprOp.setOperandType(op.getLhsOperand().getType());
exprOp.setLhs((ExpressionOperator)
logToPhyMap.get(op.getLhsOperand()));
exprOp.setRhs((ExpressionOperator)
logToPhyMap.get(op.getRhsOperand()));
@@ -163,6 +165,7 @@
BinaryComparisonOperator exprOp = new GTOrEqualToExpr(new OperatorKey(
scope, nodeGen.getNextNodeId(scope)), op
.getRequestedParallelism());
+ exprOp.setAlias(op.getAlias());
exprOp.setOperandType(op.getLhsOperand().getType());
exprOp.setLhs((ExpressionOperator)
logToPhyMap.get(op.getLhsOperand()));
exprOp.setRhs((ExpressionOperator)
logToPhyMap.get(op.getRhsOperand()));
@@ -192,6 +195,7 @@
BinaryComparisonOperator exprOp = new LTOrEqualToExpr(new OperatorKey(
scope, nodeGen.getNextNodeId(scope)), op
.getRequestedParallelism());
+ exprOp.setAlias(op.getAlias());
exprOp.setOperandType(op.getLhsOperand().getType());
exprOp.setLhs((ExpressionOperator)
logToPhyMap.get(op.getLhsOperand()));
exprOp.setRhs((ExpressionOperator)
logToPhyMap.get(op.getRhsOperand()));
@@ -221,6 +225,7 @@
BinaryComparisonOperator exprOp = new EqualToExpr(new OperatorKey(
scope, nodeGen.getNextNodeId(scope)), op
.getRequestedParallelism());
+ exprOp.setAlias(op.getAlias());
exprOp.setOperandType(op.getLhsOperand().getType());
exprOp.setLhs((ExpressionOperator)
logToPhyMap.get(op.getLhsOperand()));
exprOp.setRhs((ExpressionOperator)
logToPhyMap.get(op.getRhsOperand()));
@@ -250,6 +255,7 @@
BinaryComparisonOperator exprOp = new NotEqualToExpr(new OperatorKey(
scope, nodeGen.getNextNodeId(scope)), op
.getRequestedParallelism());
+ exprOp.setAlias(op.getAlias());
exprOp.setOperandType(op.getLhsOperand().getType());
exprOp.setLhs((ExpressionOperator)
logToPhyMap.get(op.getLhsOperand()));
exprOp.setRhs((ExpressionOperator)
logToPhyMap.get(op.getRhsOperand()));
@@ -279,6 +285,7 @@
BinaryComparisonOperator exprOp =
new PORegexp(new OperatorKey(scope, nodeGen.getNextNodeId(scope)),
op.getRequestedParallelism());
+ exprOp.setAlias(op.getAlias());
exprOp.setLhs((ExpressionOperator)logToPhyMap.get(op.getLhsOperand()));
exprOp.setRhs((ExpressionOperator)logToPhyMap.get(op.getRhsOperand()));
LogicalPlan lp = op.getPlan();
@@ -306,6 +313,7 @@
String scope = op.getOperatorKey().scope;
BinaryExpressionOperator exprOp = new Add(new OperatorKey(scope,
nodeGen.getNextNodeId(scope)), op.getRequestedParallelism());
+ exprOp.setAlias(op.getAlias());
exprOp.setResultType(op.getType());
exprOp.setLhs((ExpressionOperator)
logToPhyMap.get(op.getLhsOperand()));
exprOp.setRhs((ExpressionOperator)
logToPhyMap.get(op.getRhsOperand()));
@@ -334,6 +342,7 @@
String scope = op.getOperatorKey().scope;
BinaryExpressionOperator exprOp = new Subtract(new OperatorKey(scope,
nodeGen.getNextNodeId(scope)), op.getRequestedParallelism());
+ exprOp.setAlias(op.getAlias());
exprOp.setResultType(op.getType());
exprOp.setLhs((ExpressionOperator)
logToPhyMap.get(op.getLhsOperand()));
exprOp.setRhs((ExpressionOperator)
logToPhyMap.get(op.getRhsOperand()));
@@ -362,6 +371,7 @@
String scope = op.getOperatorKey().scope;
BinaryExpressionOperator exprOp = new Multiply(new OperatorKey(scope,
nodeGen.getNextNodeId(scope)), op.getRequestedParallelism());
+ exprOp.setAlias(op.getAlias());
exprOp.setResultType(op.getType());
exprOp.setLhs((ExpressionOperator)
logToPhyMap.get(op.getLhsOperand()));
exprOp.setRhs((ExpressionOperator)
logToPhyMap.get(op.getRhsOperand()));
@@ -390,6 +400,7 @@
String scope = op.getOperatorKey().scope;
BinaryExpressionOperator exprOp = new Divide(new OperatorKey(scope,
nodeGen.getNextNodeId(scope)), op.getRequestedParallelism());
+ exprOp.setAlias(op.getAlias());
exprOp.setResultType(op.getType());
exprOp.setLhs((ExpressionOperator)
logToPhyMap.get(op.getLhsOperand()));
exprOp.setRhs((ExpressionOperator)
logToPhyMap.get(op.getRhsOperand()));
@@ -418,6 +429,7 @@
String scope = op.getOperatorKey().scope;
BinaryExpressionOperator exprOp = new Mod(new OperatorKey(scope,
nodeGen.getNextNodeId(scope)), op.getRequestedParallelism());
+ exprOp.setAlias(op.getAlias());
exprOp.setResultType(op.getType());
exprOp.setLhs((ExpressionOperator)
logToPhyMap.get(op.getLhsOperand()));
exprOp.setRhs((ExpressionOperator)
logToPhyMap.get(op.getRhsOperand()));
@@ -445,6 +457,7 @@
public void visit(LOAnd op) throws VisitorException {
String scope = op.getOperatorKey().scope;
BinaryComparisonOperator exprOp = new POAnd(new OperatorKey(scope,
nodeGen.getNextNodeId(scope)), op.getRequestedParallelism());
+ exprOp.setAlias(op.getAlias());
exprOp.setLhs((ExpressionOperator)logToPhyMap.get(op.getLhsOperand()));
exprOp.setRhs((ExpressionOperator)logToPhyMap.get(op.getRhsOperand()));
LogicalPlan lp = op.getPlan();
@@ -470,6 +483,7 @@
public void visit(LOOr op) throws VisitorException {
String scope = op.getOperatorKey().scope;
BinaryComparisonOperator exprOp = new POOr(new OperatorKey(scope,
nodeGen.getNextNodeId(scope)), op.getRequestedParallelism());
+ exprOp.setAlias(op.getAlias());
exprOp.setLhs((ExpressionOperator)logToPhyMap.get(op.getLhsOperand()));
exprOp.setRhs((ExpressionOperator)logToPhyMap.get(op.getRhsOperand()));
LogicalPlan lp = op.getPlan();
@@ -495,6 +509,7 @@
public void visit(LONot op) throws VisitorException {
String scope = op.getOperatorKey().scope;
UnaryComparisonOperator exprOp = new PONot(new OperatorKey(scope,
nodeGen.getNextNodeId(scope)), op.getRequestedParallelism());
+ exprOp.setAlias(op.getAlias());
exprOp.setExpr((ExpressionOperator)logToPhyMap.get(op.getOperand()));
LogicalPlan lp = op.getPlan();
@@ -521,9 +536,10 @@
POGlobalRearrange poGlobal = new POGlobalRearrange(new OperatorKey(
scope, nodeGen.getNextNodeId(scope)), cs
.getRequestedParallelism());
+ poGlobal.setAlias(cs.getAlias());
POPackage poPackage = new POPackage(new OperatorKey(scope, nodeGen
.getNextNodeId(scope)), cs.getRequestedParallelism());
-
+ poGlobal.setAlias(cs.getAlias());
currentPlan.add(poGlobal);
currentPlan.add(poPackage);
@@ -554,6 +570,7 @@
POUserFunc gfc = new POUserFunc(new OperatorKey(scope,
nodeGen.getNextNodeId(scope)),cs.getRequestedParallelism(),
Arrays.asList((PhysicalOperator)ce1,(PhysicalOperator)ce2), new
FuncSpec(GFCross.class.getName()));
+ gfc.setAlias(cs.getAlias());
gfc.setResultType(DataType.BAG);
fep1.addAsLeaf(gfc);
gfc.setInputs(Arrays.asList((PhysicalOperator)ce1,(PhysicalOperator)ce2));
@@ -563,6 +580,7 @@
PhysicalPlan fep2 = new PhysicalPlan();
POProject feproj = new POProject(new OperatorKey(scope,
nodeGen.getNextNodeId(scope)), cs.getRequestedParallelism());
+ feproj.setAlias(cs.getAlias());
feproj.setResultType(DataType.TUPLE);
feproj.setStar(true);
feproj.setOverloaded(false);
@@ -570,16 +588,19 @@
List<PhysicalPlan> fePlans = Arrays.asList(fep1, fep2);
POForEach fe = new POForEach(new OperatorKey(scope,
nodeGen.getNextNodeId(scope)), cs.getRequestedParallelism(), fePlans,
flattenLst );
+ fe.setAlias(cs.getAlias());
currentPlan.add(fe);
currentPlan.connect(logToPhyMap.get(op), fe);
POLocalRearrange physOp = new POLocalRearrange(new OperatorKey(
scope, nodeGen.getNextNodeId(scope)), cs
.getRequestedParallelism());
+ physOp.setAlias(cs.getAlias());
List<PhysicalPlan> lrPlans = new ArrayList<PhysicalPlan>();
for(int i=0;i<inputs.size();i++){
PhysicalPlan lrp1 = new PhysicalPlan();
POProject lrproj1 = new POProject(new OperatorKey(scope,
nodeGen.getNextNodeId(scope)), cs.getRequestedParallelism(), i);
+ lrproj1.setAlias(cs.getAlias());
lrproj1.setOverloaded(false);
lrproj1.setResultType(DataType.INTEGER);
lrp1.add(lrproj1);
@@ -620,6 +641,7 @@
for(int i=1;i<=count;i++){
PhysicalPlan fep1 = new PhysicalPlan();
POProject feproj1 = new POProject(new OperatorKey(scope,
nodeGen.getNextNodeId(scope)), cs.getRequestedParallelism(), i);
+ feproj1.setAlias(cs.getAlias());
feproj1.setResultType(DataType.BAG);
feproj1.setOverloaded(false);
fep1.add(feproj1);
@@ -628,6 +650,7 @@
}
POForEach fe = new POForEach(new OperatorKey(scope,
nodeGen.getNextNodeId(scope)), cs.getRequestedParallelism(), fePlans,
flattenLst );
+ fe.setAlias(cs.getAlias());
currentPlan.add(fe);
try{
currentPlan.connect(poPackage, fe);
@@ -658,9 +681,10 @@
POGlobalRearrange poGlobal = new POGlobalRearrange(new OperatorKey(
scope, nodeGen.getNextNodeId(scope)),
cg.getRequestedParallelism());
+ poGlobal.setAlias(cg.getAlias());
POPackage poPackage = new POPackage(new OperatorKey(scope, nodeGen
.getNextNodeId(scope)), cg.getRequestedParallelism());
-
+ poPackage.setAlias(cg.getAlias());
currentPlan.add(poGlobal);
currentPlan.add(poPackage);
@@ -677,8 +701,8 @@
for (LogicalOperator op : inputs) {
List<LogicalPlan> plans =
(List<LogicalPlan>)cg.getGroupByPlans().get(op);
POLocalRearrange physOp = new POLocalRearrange(new OperatorKey(
- scope, nodeGen.getNextNodeId(scope)), cg
- .getRequestedParallelism());
+ scope, nodeGen.getNextNodeId(scope)),
cg.getRequestedParallelism());
+ physOp.setAlias(cg.getAlias());
List<PhysicalPlan> exprPlans = new ArrayList<PhysicalPlan>();
currentPlans.push(currentPlan);
for (LogicalPlan lp : plans) {
@@ -742,7 +766,7 @@
List<LogicalPlan> plans = (List<LogicalPlan>)
cg.getGroupByPlans().get(op);
POCollectedGroup physOp = new POCollectedGroup(new OperatorKey(
scope, nodeGen.getNextNodeId(scope)));
-
+ physOp.setAlias(cg.getAlias());
List<PhysicalPlan> exprPlans = new ArrayList<PhysicalPlan>();
currentPlans.push(currentPlan);
for (LogicalPlan lp : plans) {
@@ -836,6 +860,7 @@
try {
skj = new POSkewedJoin(new
OperatorKey(scope,nodeGen.getNextNodeId(scope)),loj.getRequestedParallelism(),
inp, loj.getInnerFlags());
+ skj.setAlias(loj.getAlias());
skj.setJoinPlans(joinPlans);
}
catch (Exception e) {
@@ -923,6 +948,7 @@
pfrj = new POFRJoin(new
OperatorKey(scope,nodeGen.getNextNodeId(scope)),loj.getRequestedParallelism(),
inp, ppLists, keyTypes, null,
fragment, isLeftOuter, nullTuple);
+ pfrj.setAlias(loj.getAlias());
} catch (ExecException e1) {
int errCode = 2058;
String msg = "Unable to set index on newly create
POLocalRearrange.";
@@ -973,9 +999,10 @@
POGlobalRearrange poGlobal = new POGlobalRearrange(new
OperatorKey(
scope, nodeGen.getNextNodeId(scope)), loj
.getRequestedParallelism());
+ poGlobal.setAlias(loj.getAlias());
POPackage poPackage = new POPackage(new OperatorKey(scope,
nodeGen
.getNextNodeId(scope)), loj.getRequestedParallelism());
-
+ poPackage.setAlias(loj.getAlias());
currentPlan.add(poGlobal);
currentPlan.add(poPackage);
@@ -1060,6 +1087,7 @@
PhysicalPlan fep1 = new PhysicalPlan();
POProject feproj1 = new POProject(new OperatorKey(scope,
nodeGen.getNextNodeId(scope)),
loj.getRequestedParallelism(), i+1); //i+1 since
the first column is the "group" field
+ feproj1.setAlias(loj.getAlias());
feproj1.setResultType(DataType.BAG);
feproj1.setOverloaded(false);
fep1.add(feproj1);
@@ -1080,6 +1108,7 @@
POForEach fe = new POForEach(new OperatorKey(scope,
nodeGen.getNextNodeId(scope)),
loj.getRequestedParallelism(), fePlans, flattenLst );
+ fe.setAlias(loj.getAlias());
currentPlan.add(fe);
currentPlan.connect(poPackage, fe);
logToPhyMap.put(loj, fe);
@@ -1155,6 +1184,7 @@
String scope = filter.getOperatorKey().scope;
POFilter poFilter = new POFilter(new OperatorKey(scope, nodeGen
.getNextNodeId(scope)), filter.getRequestedParallelism());
+ poFilter.setAlias(filter.getAlias());
poFilter.setResultType(filter.getType());
currentPlan.add(poFilter);
logToPhyMap.put(filter, poFilter);
@@ -1197,6 +1227,7 @@
POStream poStream = new POStream(new OperatorKey(scope, nodeGen
.getNextNodeId(scope)), stream.getExecutableManager(),
stream.getStreamingCommand(), this.pc.getProperties());
+ poStream.setAlias(stream.getAlias());
currentPlan.add(poStream);
logToPhyMap.put(stream, poStream);
@@ -1232,6 +1263,7 @@
exprOp = new POProject(new OperatorKey(scope, nodeGen
.getNextNodeId(scope)), op.getRequestedParallelism());
}
+ exprOp.setAlias(op.getAlias());
exprOp.setResultType(op.getType());
exprOp.setColumns((ArrayList)op.getProjection());
exprOp.setStar(op.isStar());
@@ -1282,6 +1314,7 @@
POForEach poFE = new POForEach(new OperatorKey(scope, nodeGen
.getNextNodeId(scope)), g.getRequestedParallelism(),
innerPlans,
g.getFlatten());
+ poFE.setAlias(g.getAlias());
poFE.setResultType(g.getType());
logToPhyMap.put(g, poFE);
currentPlan.add(poFE);
@@ -1337,6 +1370,7 @@
.getNextNodeId(scope)), s.getRequestedParallelism(), null,
sortPlans, s.getAscendingCols(), comparator);
}
+ sort.setAlias(s.getAlias());
sort.setLimit(s.getLimit());
// sort.setRequestedParallelism(s.getType());
logToPhyMap.put(s, sort);
@@ -1377,6 +1411,7 @@
// push it in the current plan and make the connections
PhysicalOperator physOp = new PODistinct(new OperatorKey(scope, nodeGen
.getNextNodeId(scope)), op.getRequestedParallelism());
+ physOp.setAlias(op.getAlias());
physOp.setResultType(op.getType());
logToPhyMap.put(op, physOp);
currentPlan.add(physOp);
@@ -1406,6 +1441,7 @@
String scope = split.getOperatorKey().scope;
PhysicalOperator physOp = new POSplit(new OperatorKey(scope, nodeGen
.getNextNodeId(scope)), split.getRequestedParallelism());
+ physOp.setAlias(split.getAlias());
FileSpec splStrFile;
try {
splStrFile = new FileSpec(FileLocalizer.getTemporaryPath(null,
pc).toString(),new FuncSpec(BinStorage.class.getName()));
@@ -1457,6 +1493,7 @@
String scope = split.getOperatorKey().scope;
PhysicalOperator physOp = new POFilter(new OperatorKey(scope, nodeGen
.getNextNodeId(scope)), split.getRequestedParallelism());
+ physOp.setAlias(split.getAlias());
logToPhyMap.put(split, physOp);
currentPlan.add(physOp);
@@ -1506,6 +1543,7 @@
.getNextNodeId(scope)), func.getRequestedParallelism(),
null, func.getFuncSpec(), (ComparisonFunc) f);
}
+ p.setAlias(func.getAlias());
p.setResultType(func.getType());
currentPlan.add(p);
List<org.apache.pig.impl.logicalLayer.ExpressionOperator> fromList =
func.getArguments();
@@ -1530,6 +1568,7 @@
String scope = loLoad.getOperatorKey().scope;
POLoad load = new POLoad(new OperatorKey(scope, nodeGen
.getNextNodeId(scope)), loLoad.isSplittable());
+ load.setAlias(loLoad.getAlias());
load.setLFile(loLoad.getInputFile());
load.setPc(pc);
load.setResultType(loLoad.getType());
@@ -1561,6 +1600,7 @@
POStore store = new POStore(new OperatorKey(scope, nodeGen
.getNextNodeId(scope)));
+
store.setAlias(loStore.getPlan().getPredecessors(loStore).get(0).getAlias());
store.setSFile(loStore.getOutputFile());
store.setInputSpec(loStore.getInputSpec());
try {
@@ -1618,6 +1658,7 @@
String scope = op.getOperatorKey().scope;
ConstantExpression ce = new ConstantExpression(new OperatorKey(scope,
nodeGen.getNextNodeId(scope)));
+ ce.setAlias(op.getAlias());
ce.setValue(op.getValue());
ce.setResultType(op.getType());
//this operator doesn't have any predecessors
@@ -1630,6 +1671,7 @@
String scope = op.getOperatorKey().scope;
ExpressionOperator physOp = new POBinCond(new OperatorKey(scope,
nodeGen.getNextNodeId(scope)), op.getRequestedParallelism());
+ physOp.setAlias(op.getAlias());
logToPhyMap.put(op, physOp);
POBinCond phy = (POBinCond) physOp;
ExpressionOperator cond = (ExpressionOperator) logToPhyMap.get(op
@@ -1665,6 +1707,7 @@
ExpressionOperator physOp = new PONegative(new OperatorKey(scope,
nodeGen.getNextNodeId(scope)), op.getRequestedParallelism(),
null);
+ physOp.setAlias(op.getAlias());
currentPlan.add(physOp);
logToPhyMap.put(op, physOp);
@@ -1697,7 +1740,7 @@
String scope = op.getOperatorKey().scope;
UnaryComparisonOperator physOp = new POIsNull(new OperatorKey(scope,
nodeGen
.getNextNodeId(scope)), op.getRequestedParallelism(), null);
-
+ physOp.setAlias(op.getAlias());
List<LogicalOperator> inputs = op.getPlan().getPredecessors(op);
ExpressionOperator from;
@@ -1734,6 +1777,7 @@
nodeGen.getNextNodeId(scope)), op.getRequestedParallelism(), op
.getLookUpKey());
physOp.setResultType(op.getType());
+ physOp.setAlias(op.getAlias());
currentPlan.add(physOp);
logToPhyMap.put(op, physOp);
@@ -1755,6 +1799,7 @@
String scope = op.getOperatorKey().scope;
ExpressionOperator physOp = new POCast(new OperatorKey(scope, nodeGen
.getNextNodeId(scope)), op.getRequestedParallelism());
+ physOp.setAlias(op.getAlias());
currentPlan.add(physOp);
logToPhyMap.put(op, physOp);
@@ -1781,6 +1826,7 @@
POLimit poLimit = new POLimit(new OperatorKey(scope,
nodeGen.getNextNodeId(scope)), limit.getRequestedParallelism());
poLimit.setResultType(limit.getType());
poLimit.setLimit(limit.getLimit());
+ poLimit.setAlias(limit.getAlias());
currentPlan.add(poLimit);
logToPhyMap.put(limit, poLimit);
@@ -1808,6 +1854,7 @@
String scope = op.getOperatorKey().scope;
POUnion physOp = new POUnion(new OperatorKey(scope, nodeGen
.getNextNodeId(scope)), op.getRequestedParallelism());
+ physOp.setAlias(op.getAlias());
currentPlan.add(physOp);
physOp.setResultType(op.getType());
logToPhyMap.put(op, physOp);
Modified:
hadoop/pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/PhysicalOperator.java
URL:
http://svn.apache.org/viewvc/hadoop/pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/PhysicalOperator.java?rev=892396&r1=892395&r2=892396&view=diff
==============================================================================
---
hadoop/pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/PhysicalOperator.java
(original)
+++
hadoop/pig/trunk/src/org/apache/pig/backend/hadoop/executionengine/physicalLayer/PhysicalOperator.java
Fri Dec 18 23:15:57 2009
@@ -89,6 +89,10 @@
// The result of performing the operation along with the output
protected Result res = null;
+
+ // alias associated with this PhysicalOperator
+ protected String alias = null;
+
// Will be used by operators to report status or transmit heartbeat
// Should be set by the backends to appropriate implementations that
// wrap their own version of a reporter.
@@ -161,6 +165,14 @@
return resultType;
}
+ public String getAlias() {
+ return alias;
+ }
+
+ public void setAlias(String alias) {
+ this.alias = alias;
+ }
+
public void setAccumulative() {
accum = true;
}
Modified:
hadoop/pig/trunk/src/org/apache/pig/backend/local/executionengine/LocalJob.java
URL:
http://svn.apache.org/viewvc/hadoop/pig/trunk/src/org/apache/pig/backend/local/executionengine/LocalJob.java?rev=892396&r1=892395&r2=892396&view=diff
==============================================================================
---
hadoop/pig/trunk/src/org/apache/pig/backend/local/executionengine/LocalJob.java
(original)
+++
hadoop/pig/trunk/src/org/apache/pig/backend/local/executionengine/LocalJob.java
Fri Dec 18 23:15:57 2009
@@ -44,6 +44,7 @@
protected JOB_STATUS status;
protected PigContext pigContext;
protected FileSpec outFileSpec;
+ protected String alias;
private PigStats stats;
public LocalJob(JOB_STATUS status,
@@ -162,4 +163,9 @@
public Exception getException() {
return null;
}
+
+ @Override
+ public String getAlias() throws ExecException {
+ return alias;
+ }
}
Added: hadoop/pig/trunk/test/org/apache/pig/test/TestBatchAliases.java
URL:
http://svn.apache.org/viewvc/hadoop/pig/trunk/test/org/apache/pig/test/TestBatchAliases.java?rev=892396&view=auto
==============================================================================
--- hadoop/pig/trunk/test/org/apache/pig/test/TestBatchAliases.java (added)
+++ hadoop/pig/trunk/test/org/apache/pig/test/TestBatchAliases.java Fri Dec 18
23:15:57 2009
@@ -0,0 +1,99 @@
+/*
+ * 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.pig.test;
+
+import java.io.IOException;
+import java.util.List;
+
+import junit.framework.Assert;
+import junit.framework.TestCase;
+
+import org.apache.pig.ExecType;
+import org.apache.pig.PigServer;
+import org.apache.pig.backend.executionengine.ExecJob;
+import org.apache.pig.impl.io.FileLocalizer;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+public class TestBatchAliases extends TestCase {
+
+ private static final MiniCluster cluster = MiniCluster.buildCluster();
+
+ private PigServer myPig;
+
+ @Before
+ public void setUp() throws Exception {
+ cluster.setProperty("opt.multiquery", ""+true);
+ myPig = new PigServer(ExecType.MAPREDUCE, cluster.getProperties());
+ deleteOutputFiles();
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ myPig = null;
+ }
+
+ @Test
+ public void testBatchAliases() {
+
+ // test case: key ('group') isn't part of foreach output
+ // and keys have the same type.
+
+ try {
+ myPig.setBatchOn();
+
+ myPig.registerQuery("a = load
'file:test/org/apache/pig/test/data/passwd' " +
+ "using PigStorage(':') as (uname:chararray,
passwd:chararray, uid:int, gid:int);");
+ myPig.registerQuery("b = group a by uid;");
+ myPig.registerQuery("c = group a by gid;");
+ myPig.registerQuery("d = foreach b generate SUM(a.gid);");
+ myPig.registerQuery("e = foreach c generate group, COUNT(a);");
+ myPig.registerQuery("store d into '/tmp/output1';");
+ myPig.registerQuery("store e into '/tmp/output2';");
+
+ List<ExecJob> jobs = myPig.executeBatch();
+ boolean foundD=false;
+ boolean foundE=false;
+ for (ExecJob job : jobs) {
+ assertTrue(job.getStatus() == ExecJob.JOB_STATUS.COMPLETED);
+ foundD = foundD || "d".equals(job.getAlias());
+ foundE = foundE || "e".equals(job.getAlias());
+ }
+ assertTrue(foundD);
+ assertTrue(foundE);
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ Assert.fail();
+ }
+ }
+
+ private void deleteOutputFiles() {
+ try {
+ FileLocalizer.delete("/tmp/output1", myPig.getPigContext());
+ FileLocalizer.delete("/tmp/output2", myPig.getPigContext());
+ FileLocalizer.delete("/tmp/output3", myPig.getPigContext());
+ FileLocalizer.delete("/tmp/output4", myPig.getPigContext());
+ FileLocalizer.delete("/tmp/output5", myPig.getPigContext());
+ } catch (IOException e) {
+ e.printStackTrace();
+ Assert.fail();
+ }
+ }
+}
Modified: hadoop/pig/trunk/test/org/apache/pig/test/data/GoldenFiles/MRC18.gld
URL:
http://svn.apache.org/viewvc/hadoop/pig/trunk/test/org/apache/pig/test/data/GoldenFiles/MRC18.gld?rev=892396&r1=892395&r2=892396&view=diff
==============================================================================
--- hadoop/pig/trunk/test/org/apache/pig/test/data/GoldenFiles/MRC18.gld
(original)
+++ hadoop/pig/trunk/test/org/apache/pig/test/data/GoldenFiles/MRC18.gld Fri
Dec 18 23:15:57 2009
@@ -20,4 +20,4 @@
| | |
| | Constant(all) - scope-127
| |
- |
|---Load(file:/tmp/input2:org.apache.pig.impl.builtin.MergeJoinIndexer('org.apache.pig.builtin.PigStorage','kmonaaafhdhcaabdgkgbhggbcohfhegjgmcoebhchcgbhjemgjhdhehiibncbnjjmhgbjnadaaabejaaaehdgjhkgfhihaaaaaaaabhhaeaaaaaaabhdhcaaeogphcghcogbhagbgdgigfcohagjghcogcgbgdglgfgogecogigbgegpgphacogfhigfgdhfhegjgpgogfgoghgjgogfcohagihjhdgjgdgbgmemgbhjgfhccohagmgbgohdcofagihjhdgjgdgbgmfagmgbgoaaaaaaaaaaaaaaabacaaabfkaaangfgogeepggebgmgmejgohahfhehihcaacfgphcghcogbhagbgdgigfcohagjghcogjgnhagmcohagmgbgocoephagfhcgbhegphcfagmgbgohlinhnlnngaiiihoacaaagemaaakgneghcgpgnefgeghgfhdheaacdemgphcghcpgbhagbgdgigfcphagjghcpgjgnhagmcphfhegjgmcpenhfgmhegjengbhadlemaaafgnelgfhjhdheaaapemgkgbhggbcphfhegjgmcpengbhadlemaaahgnemgfgbhggfhdheaabaemgkgbhggbcphfhegjgmcpemgjhdhedlemaaaegnephahdhbaahoaaafemaaaggnfcgpgphehdhbaahoaaagemaaaignfegpefgeghgfhdhbaahoaaaehihahdhcaacbgphcghcogbhagbgdgigfcohagjghcogjgnhagmcohfhegjgmcoenhfgmhegjengbhaaaaaaaaaaaaaaaacacaaabemaaaegnengbhahbaahoaaafhihahdhcaabbgkgbh
ggbcohfhegjgmcoeigbhdgiengbhaafahnkmbmdbgganbadaaacegaaakgmgpgbgeeggbgdhegphcejaaajhegihcgfhdgigpgmgehihadpeaaaaaaaaaaaamhhaiaaaaaabaaaaaaaaahihdhbaahoaaakdpeaaaaaaaaaaaamhhaiaaaaaabaaaaaaaabhdhcaacegphcghcogbhagbgdgigfcohagjghcogjgnhagmcohagmgbgocoephagfhcgbhegphcelgfhjaaaaaaaaaaaaaaabacaaacekaaacgjgeemaaafhdgdgphagfheaabcemgkgbhggbcpgmgbgoghcpfdhehcgjgoghdlhihaaaaaaaaaaaaaaahiheaaafhdgdgphagfhdhcaafjgphcghcogbhagbgdgigfcohagjghcogcgbgdglgfgogecogigbgegpgphacogfhigfgdhfhegjgpgogfgoghgjgogfcohagihjhdgjgdgbgmemgbhjgfhccogfhihahcgfhdhdgjgpgoephagfhcgbhegphchdcofaepfahcgpgkgfgdheaaaaaaaaaaaaaaabacaaaffkaaakgphggfhcgmgpgbgegfgefkaabfhahcgpgdgfhdhdgjgoghecgbghepggfehfhagmgfhdfkaabehcgfhdhfgmhefdgjgoghgmgffehfhagmgfecgbghfkaaaehdhegbhcemaaahgdgpgmhfgngohdheaabfemgkgbhggbcphfhegjgmcpebhchcgbhjemgjhdhedlhihcaagcgphcghcogbhagbgdgigfcohagjghcogcgbgdglgfgogecogigbgegpgphacogfhigfgdhfhegjgpgogfgoghgjgogfcohagihjhdgjgdgbgmemgbhjgfhccogfhihahcgfhdhdgjgpgoephagfhcgbhegphchdcoefhihahcgfhdhd
gjgpgoephagfhcgbhegphcaaaaaaaaaaaaaaabacaaabemaaadgmgpghheaacaemgphcghcpgbhagbgdgigfcpgdgpgngngpgohdcpgmgpghghgjgoghcpemgpghdlhihcaaemgphcghcogbhagbgdgigfcohagjghcogcgbgdglgfgogecogigbgegpgphacogfhigfgdhfhegjgpgogfgoghgjgogfcohagihjhdgjgdgbgmemgbhjgfhccofagihjhdgjgdgbgmephagfhcgbhegphcaaaaaaaaaaaaaaabacaaalfkaaafgbgdgdhfgnfkaaangjgohahfheebhehegbgdgigfgeejaabehcgfhbhfgfhdhegfgefagbhcgbgmgmgfgmgjhdgnecaaakhcgfhdhfgmhefehjhagfemaaafgjgohahfheheaablemgphcghcpgbhagbgdgigfcphagjghcpgegbhegbcpfehfhagmgfdlemaaaggjgohahfhehdhbaahoaaagemaaangmgjgogfgbghgffehcgbgdgfhcheaachemgphcghcpgbhagbgdgigfcphagjghcphagfgocphfhegjgmcpemgjgogfgbghgffehcgbgdgfhcdlemaaadgmgpghhbaahoaabeemaaahgphfhehahfhehdhbaahoaaagemaaakhagbhcgfgohefagmgbgoheaafaemgphcghcpgbhagbgdgigfcphagjghcpgcgbgdglgfgogecpgigbgegpgphacpgfhigfgdhfhegjgpgogfgoghgjgogfcphagihjhdgjgdgbgmemgbhjgfhccphagmgbgohdcpfagihjhdgjgdgbgmfagmgbgodlemaaadhcgfhdheaaeeemgphcghcpgbhagbgdgigfcphagjghcpgcgbgdglgfgogecpgigbgegpgphacpgfhigfgdhfhegjgpg
ogfgoghgjgogfcphagihjhdgjgdgbgmemgbhjgfhccpfcgfhdhfgmhedlhihcaacbgphcghcogbhagbgdgigfcohagjghcogjgnhagmcohagmgbgocoephagfhcgbhegphcaaaaaaaaaaaaaaabacaaabemaaaegnelgfhjheaacgemgphcghcpgbhagbgdgigfcphagjghcpgjgnhagmcphagmgbgocpephagfhcgbhegphcelgfhjdlhihahbaahoaaapaaaappppppppdchahahahdhcaaclgphcghcogbhagbgdgigfcogdgpgngngpgohdcogmgpghghgjgoghcogjgnhagmcoemgpghdeekemgpghghgfhccikmpnoicknfncdiacaaabemaaaegogbgngfhbaahoaaaohihaheaafjgphcghcogbhagbgdgigfcohagjghcogcgbgdglgfgogecogigbgegpgphacogfhigfgdhfhegjgpgogfgoghgjgogfcohagihjhdgjgdgbgmemgbhjgfhccogfhihahcgfhdhdgjgpgoephagfhcgbhegphchdcofaepfahcgpgkgfgdhehahahdhcaaecgphcghcogbhagbgdgigfcohagjghcogcgbgdglgfgogecogigbgegpgphacogfhigfgdhfhegjgpgogfgoghgjgogfcohagihjhdgjgdgbgmemgbhjgfhccofcgfhdhfgmheaaaaaaaaaaaaaaabacaaacecaaamhcgfhehfhcgofdhegbhehfhdemaaaghcgfhdhfgmheheaabcemgkgbhggbcpgmgbgoghcpepgcgkgfgdhedlhihaachahbaahoaaboaaaaaaaahdhbaahoaaaaaaaaaaabhhaeaaaaaaabhdhcaabbgkgbhggbcogmgbgoghcoejgohegfghgfhcbcockakephibihdiacaaab
ejaaafhggbgmhfgfhihcaabagkgbhggbcogmgbgoghcoeohfgngcgfhcigkmjfbnaljeoailacaaaahihaaaaaaaaahihihdhbaahoaaaaaaaaaaabhhaeaaaaaaakhbaahoaabmhihdhbaahoaaakdpeaaaaaaaaaaaamhhaiaaaaaabaaaaaaaabhbaahoaabmhbaahoaaaphihdhbaahoaaaaaaaaaaaahhaeaaaaaaakhihdhbaahoaaaihdhbaahoaaakdpeaaaaaaaaaaaamhhaiaaaaaabaaaaaaaaahiaahi',''))
- scope-118
\ No newline at end of file
+ |
|---Load(file:/tmp/input2:org.apache.pig.impl.builtin.MergeJoinIndexer('org.apache.pig.builtin.PigStorage','kmonaaafhdhcaabdgkgbhggbcohfhegjgmcoebhchcgbhjemgjhdhehiibncbnjjmhgbjnadaaabejaaaehdgjhkgfhihaaaaaaaabhhaeaaaaaaabhdhcaaeogphcghcogbhagbgdgigfcohagjghcogcgbgdglgfgogecogigbgegpgphacogfhigfgdhfhegjgpgogfgoghgjgogfcohagihjhdgjgdgbgmemgbhjgfhccohagmgbgohdcofagihjhdgjgdgbgmfagmgbgoaaaaaaaaaaaaaaabacaaabfkaaangfgogeepggebgmgmejgohahfhehihcaacfgphcghcogbhagbgdgigfcohagjghcogjgnhagmcohagmgbgocoephagfhcgbhegphcfagmgbgohlinhnlnngaiiihoacaaagemaaakgneghcgpgnefgeghgfhdheaacdemgphcghcpgbhagbgdgigfcphagjghcpgjgnhagmcphfhegjgmcpenhfgmhegjengbhadlemaaafgnelgfhjhdheaaapemgkgbhggbcphfhegjgmcpengbhadlemaaahgnemgfgbhggfhdheaabaemgkgbhggbcphfhegjgmcpemgjhdhedlemaaaegnephahdhbaahoaaafemaaaggnfcgpgphehdhbaahoaaagemaaaignfegpefgeghgfhdhbaahoaaaehihahdhcaacbgphcghcogbhagbgdgigfcohagjghcogjgnhagmcohfhegjgmcoenhfgmhegjengbhaaaaaaaaaaaaaaaacacaaabemaaaegnengbhahbaahoaaafhihahdhcaabbgkgbh
ggbcohfhegjgmcoeigbhdgiengbhaafahnkmbmdbgganbadaaacegaaakgmgpgbgeeggbgdhegphcejaaajhegihcgfhdgigpgmgehihadpeaaaaaaaaaaaamhhaiaaaaaabaaaaaaaaahihdhbaahoaaakdpeaaaaaaaaaaaamhhaiaaaaaabaaaaaaaabhdhcaacegphcghcogbhagbgdgigfcohagjghcogjgnhagmcohagmgbgocoephagfhcgbhegphcelgfhjaaaaaaaaaaaaaaabacaaacekaaacgjgeemaaafhdgdgphagfheaabcemgkgbhggbcpgmgbgoghcpfdhehcgjgoghdlhihaaaaaaaaaaaaaaahiheaaafhdgdgphagfhdhcaafjgphcghcogbhagbgdgigfcohagjghcogcgbgdglgfgogecogigbgegpgphacogfhigfgdhfhegjgpgogfgoghgjgogfcohagihjhdgjgdgbgmemgbhjgfhccogfhihahcgfhdhdgjgpgoephagfhcgbhegphchdcofaepfahcgpgkgfgdheaaaaaaaaaaaaaaabacaaaffkaaakgphggfhcgmgpgbgegfgefkaabfhahcgpgdgfhdhdgjgoghecgbghepggfehfhagmgfhdfkaabehcgfhdhfgmhefdgjgoghgmgffehfhagmgfecgbghfkaaaehdhegbhcemaaahgdgpgmhfgngohdheaabfemgkgbhggbcphfhegjgmcpebhchcgbhjemgjhdhedlhihcaagcgphcghcogbhagbgdgigfcohagjghcogcgbgdglgfgogecogigbgegpgphacogfhigfgdhfhegjgpgogfgoghgjgogfcohagihjhdgjgdgbgmemgbhjgfhccogfhihahcgfhdhdgjgpgoephagfhcgbhegphchdcoefhihahcgfhdhd
gjgpgoephagfhcgbhegphcaaaaaaaaaaaaaaabacaaabemaaadgmgpghheaacaemgphcghcpgbhagbgdgigfcpgdgpgngngpgohdcpgmgpghghgjgoghcpemgpghdlhihcaaemgphcghcogbhagbgdgigfcohagjghcogcgbgdglgfgogecogigbgegpgphacogfhigfgdhfhegjgpgogfgoghgjgogfcohagihjhdgjgdgbgmemgbhjgfhccofagihjhdgjgdgbgmephagfhcgbhegphcaaaaaaaaaaaaaaabacaaamfkaaafgbgdgdhfgnfkaaangjgohahfheebhehegbgdgigfgeejaabehcgfhbhfgfhdhegfgefagbhcgbgmgmgfgmgjhdgnecaaakhcgfhdhfgmhefehjhagfemaaafgbgmgjgbhdhbaahoaaaoemaaafgjgohahfheheaablemgphcghcpgbhagbgdgigfcphagjghcpgegbhegbcpfehfhagmgfdlemaaaggjgohahfhehdhbaahoaaagemaaangmgjgogfgbghgffehcgbgdgfhcheaachemgphcghcpgbhagbgdgigfcphagjghcphagfgocphfhegjgmcpemgjgogfgbghgffehcgbgdgfhcdlemaaadgmgpghhbaahoaabeemaaahgphfhehahfhehdhbaahoaaagemaaakhagbhcgfgohefagmgbgoheaafaemgphcghcpgbhagbgdgigfcphagjghcpgcgbgdglgfgogecpgigbgegpgphacpgfhigfgdhfhegjgpgogfgoghgjgogfcphagihjhdgjgdgbgmemgbhjgfhccphagmgbgohdcpfagihjhdgjgdgbgmfagmgbgodlemaaadhcgfhdheaaeeemgphcghcpgbhagbgdgigfcphagjghcpgcgbgdglgfgogecpgigbg
egpgphacpgfhigfgdhfhegjgpgogfgoghgjgogfcphagihjhdgjgdgbgmemgbhjgfhccpfcgfhdhfgmhedlhihcaacbgphcghcogbhagbgdgigfcohagjghcogjgnhagmcohagmgbgocoephagfhcgbhegphcaaaaaaaaaaaaaaabacaaabemaaaegnelgfhjheaacgemgphcghcpgbhagbgdgigfcphagjghcpgjgnhagmcphagmgbgocpephagfhcgbhegphcelgfhjdlhihahbaahoaaapaaaappppppppdchahahahahdhcaaclgphcghcogbhagbgdgigfcogdgpgngngpgohdcogmgpghghgjgoghcogjgnhagmcoemgpghdeekemgpghghgfhccikmpnoicknfncdiacaaabemaaaegogbgngfhbaahoaaaohihaheaafjgphcghcogbhagbgdgigfcohagjghcogcgbgdglgfgogecogigbgegpgphacogfhigfgdhfhegjgpgogfgoghgjgogfcohagihjhdgjgdgbgmemgbhjgfhccogfhihahcgfhdhdgjgpgoephagfhcgbhegphchdcofaepfahcgpgkgfgdhehahahdhcaaecgphcghcogbhagbgdgigfcohagjghcogcgbgdglgfgogecogigbgegpgphacogfhigfgdhfhegjgpgogfgoghgjgogfcohagihjhdgjgdgbgmemgbhjgfhccofcgfhdhfgmheaaaaaaaaaaaaaaabacaaacecaaamhcgfhehfhcgofdhegbhehfhdemaaaghcgfhdhfgmheheaabcemgkgbhggbcpgmgbgoghcpepgcgkgfgdhedlhihaachahbaahoaaboaaaaaaaahdhbaahoaaaaaaaaaaabhhaeaaaaaaabhdhcaabbgkgbhggbcogmgbgoghcoejgohegf
ghgfhcbcockakephibihdiacaaabejaaafhggbgmhfgfhihcaabagkgbhggbcogmgbgoghcoeohfgngcgfhcigkmjfbnaljeoailacaaaahihaaaaaaaaahihihdhbaahoaaaaaaaaaaabhhaeaaaaaaakhbaahoaabmhihdhbaahoaaakdpeaaaaaaaaaaaamhhaiaaaaaabaaaaaaaabhbaahoaabmhbaahoaaaphihdhbaahoaaaaaaaaaaaahhaeaaaaaaakhihdhbaahoaaaihdhbaahoaaakdpeaaaaaaaaaaaamhhaiaaaaaabaaaaaaaaahiaahi',''))
- scope-118
\ No newline at end of file