/* * 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.data; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Iterator; import org.apache.pig.backend.executionengine.ExecException; import org.apache.pig.impl.plan.OperatorKey; /** * A tuple composed with the operators to which * it needs be attached * */ public class TargetedTuple extends AbstractTuple { /** * */ private static final long serialVersionUID = 2L; private Tuple t; // The list of operators to which this tuple // has to be attached as input. public List<OperatorKey> targetOps = null; protected boolean isNull = false; public TargetedTuple() { } public TargetedTuple(Tuple t, List<OperatorKey> targetOps) { this.t = t; this.targetOps = targetOps; } @Override public String toString() { StringBuilder sb = new StringBuilder(); sb.append(super.toString()); sb.append("["); for (OperatorKey target : targetOps) { sb.append(target.toString()); sb.append(","); } sb.replace(sb.length() - 1, sb.length(), "]"); return sb.toString(); } @Override public void write(DataOutput out) throws IOException { t.write(out); out.writeInt(targetOps.size()); for (OperatorKey target : targetOps) { // Ideally I should be able to call target.write(out). // Since it doesn't support it yet handling it here out.writeInt(target.scope.length()); out.writeBytes(target.scope); out.writeLong(target.id); } } @Override public void readFields(DataInput in) throws IOException { t.readFields(in); targetOps = new ArrayList<OperatorKey>(); int size = in.readInt(); for (int i = 0; i < size; i++) { OperatorKey target = new OperatorKey(); // Ideally I should be able to call target.read(in). // Since it doesn't support it yet handling it here int scopeSz = in.readInt(); byte[] buf = new byte[scopeSz]; in.readFully(buf); target.scope = new String(buf); target.id = in.readLong(); targetOps.add(target); } } public Tuple toTuple() { return t; } public List<OperatorKey> getTargetOps() { return targetOps; } public void setTargetOps(List<OperatorKey> targetOps) { this.targetOps = targetOps; } @Override public void append(Object val) { t.append(val); } @Override public Object get(int fieldNum) throws ExecException { return t.get(fieldNum); } @Override public List<Object> getAll() { return t.getAll(); } @Override public long getMemorySize() { return t.getMemorySize(); } @Override public byte getType(int fieldNum) throws ExecException { return t.getType(fieldNum); } @Override public void reference(Tuple t) { this.t = t; } @Override public void set(int fieldNum, Object val) throws ExecException { t.set(fieldNum, val); } @Override public int size() { return t.size(); } @Override @SuppressWarnings("unchecked") public int compareTo(Object o) { return t.compareTo(o); } @Override @SuppressWarnings("unchecked") public boolean equals(Object o) { return t.equals(o); } @Override public int hashCode() { return t.hashCode(); } }