content: // Generated by the protocol buffer compiler.  DO NOT EDIT!
  // source: lot/join.proto
  
  package apsara.odps.lot;
  
  import apsara.odps.JoinTypeProtos;
  
  public final class JoinProtos {
    private JoinProtos() {}
    public static void registerAllExtensions(
        com.google.protobuf.ExtensionRegistry registry) {
    }
    public interface JoinOrBuilder
        extends com.google.protobuf.MessageOrBuilder {
      
      // required string Id = 1;
      boolean hasId();
      String getId();
      
      // required string LeftParentId = 2;
      boolean hasLeftParentId();
      String getLeftParentId();
      
      // required string RightParentId = 3;
      boolean hasRightParentId();
      String getRightParentId();
      
      // required .apsara.odps.JoinType JoinType = 4;
      boolean hasJoinType();
      JoinTypeProtos.JoinType getJoinType();
      
      // optional .apsara.odps.lot.ScalarExpression OnCondition = 5;
      boolean hasOnCondition();
      ExpressionProtos.ScalarExpression getOnCondition();
      ExpressionProtos.ScalarExpressionOrBuilder getOnConditionOrBuilder();
      
      // optional .apsara.odps.lot.Join.ExecutionType ExeType = 6 [default = Auto];
      boolean hasExeType();
      Join.ExecutionType getExeType();
      
      // repeated string SmallParents = 7;
      java.util.List<String> getSmallParentsList();
      int getSmallParentsCount();
      String getSmallParents(int index);
    }
    public static final class Join extends
        com.google.protobuf.GeneratedMessage
        implements JoinOrBuilder {
      // Use Join.newBuilder() to construct.
      private Join(Builder builder) {
        super(builder);
      }
      private Join(boolean noInit) {}
      
      private static final Join defaultInstance;
      public static Join getDefaultInstance() {
        return defaultInstance;
      }
      
      public Join getDefaultInstanceForType() {
        return defaultInstance;
      }
      
      public static final com.google.protobuf.Descriptors.Descriptor
          getDescriptor() {
        return JoinProtos.internal_static_apsara_odps_lot_Join_descriptor;
      }
      
      protected FieldAccessorTable
          internalGetFieldAccessorTable() {
        return JoinProtos.internal_static_apsara_odps_lot_Join_fieldAccessorTable;
      }
      
      public enum ExecutionType
          implements com.google.protobuf.ProtocolMessageEnum {
        Auto(0, 0),
        MergeJoin(1, 1),
        FullHashJoin(2, 2),
        ShuffledHashJoin(3, 3),
        ;
        
        public static final int Auto_VALUE = 0;
        public static final int MergeJoin_VALUE = 1;
        public static final int FullHashJoin_VALUE = 2;
        public static final int ShuffledHashJoin_VALUE = 3;
        
        
        public final int getNumber() { return value; }
        
        public static ExecutionType valueOf(int value) {
          switch (value) {
            case 0: return Auto;
            case 1: return MergeJoin;
            case 2: return FullHashJoin;
            case 3: return ShuffledHashJoin;
            default: return null;
          }
        }
        
        public static com.google.protobuf.Internal.EnumLiteMap<ExecutionType>
            internalGetValueMap() {
          return internalValueMap;
        }
        private static com.google.protobuf.Internal.EnumLiteMap<ExecutionType>
            internalValueMap =
              new com.google.protobuf.Internal.EnumLiteMap<ExecutionType>() {
                public ExecutionType findValueByNumber(int number) {
                  return ExecutionType.valueOf(number);
                }
              };
        
        public final com.google.protobuf.Descriptors.EnumValueDescriptor
            getValueDescriptor() {
          return getDescriptor().getValues().get(index);
        }
        public final com.google.protobuf.Descriptors.EnumDescriptor
            getDescriptorForType() {
          return getDescriptor();
        }
        public static final com.google.protobuf.Descriptors.EnumDescriptor
            getDescriptor() {
          return Join.getDescriptor().getEnumTypes().get(0);
        }
        
        private static final ExecutionType[] VALUES = {
          Auto, MergeJoin, FullHashJoin, ShuffledHashJoin, 
        };
        
        public static ExecutionType valueOf(
            com.google.protobuf.Descriptors.EnumValueDescriptor desc) {
          if (desc.getType() != getDescriptor()) {
            throw new IllegalArgumentException(
              "EnumValueDescriptor is not for this type.");
          }
          return VALUES[desc.getIndex()];
        }
        
        private final int index;
        private final int value;
        
        private ExecutionType(int index, int value) {
          this.index = index;
          this.value = value;
        }
        
        // @@protoc_insertion_point(enum_scope:apsara.odps.lot.Join.ExecutionType)
      }
      
      private int bitField0_;
      // required string Id = 1;
      public static final int ID_FIELD_NUMBER = 1;
      private Object id_;
      public boolean hasId() {
        return ((bitField0_ & 0x00000001) == 0x00000001);
      }
      public String getId() {
        Object ref = id_;
        if (ref instanceof String) {
          return (String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          String s = bs.toStringUtf8();
          if (com.google.protobuf.Internal.isValidUtf8(bs)) {
            id_ = s;
          }
          return s;
        }
      }
      private com.google.protobuf.ByteString getIdBytes() {
        Object ref = id_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8((String) ref);
          id_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      
      // required string LeftParentId = 2;
      public static final int LEFTPARENTID_FIELD_NUMBER = 2;
      private Object leftParentId_;
      public boolean hasLeftParentId() {
        return ((bitField0_ & 0x00000002) == 0x00000002);
      }
      public String getLeftParentId() {
        Object ref = leftParentId_;
        if (ref instanceof String) {
          return (String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          String s = bs.toStringUtf8();
          if (com.google.protobuf.Internal.isValidUtf8(bs)) {
            leftParentId_ = s;
          }
          return s;
        }
      }
      private com.google.protobuf.ByteString getLeftParentIdBytes() {
        Object ref = leftParentId_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8((String) ref);
          leftParentId_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      
      // required string RightParentId = 3;
      public static final int RIGHTPARENTID_FIELD_NUMBER = 3;
      private Object rightParentId_;
      public boolean hasRightParentId() {
        return ((bitField0_ & 0x00000004) == 0x00000004);
      }
      public String getRightParentId() {
        Object ref = rightParentId_;
        if (ref instanceof String) {
          return (String) ref;
        } else {
          com.google.protobuf.ByteString bs = 
              (com.google.protobuf.ByteString) ref;
          String s = bs.toStringUtf8();
          if (com.google.protobuf.Internal.isValidUtf8(bs)) {
            rightParentId_ = s;
          }
          return s;
        }
      }
      private com.google.protobuf.ByteString getRightParentIdBytes() {
        Object ref = rightParentId_;
        if (ref instanceof String) {
          com.google.protobuf.ByteString b = 
              com.google.protobuf.ByteString.copyFromUtf8((String) ref);
          rightParentId_ = b;
          return b;
        } else {
          return (com.google.protobuf.ByteString) ref;
        }
      }
      
      // required .apsara.odps.JoinType JoinType = 4;
      public static final int JOINTYPE_FIELD_NUMBER = 4;
      private JoinTypeProtos.JoinType joinType_;
      public boolean hasJoinType() {
        return ((bitField0_ & 0x00000008) == 0x00000008);
      }
      public JoinTypeProtos.JoinType getJoinType() {
        return joinType_;
      }
      
      // optional .apsara.odps.lot.ScalarExpression OnCondition = 5;
      public static final int ONCONDITION_FIELD_NUMBER = 5;
      private ExpressionProtos.ScalarExpression onCondition_;
      public boolean hasOnCondition() {
        return ((bitField0_ & 0x00000010) == 0x00000010);
      }
      public ExpressionProtos.ScalarExpression getOnCondition() {
        return onCondition_;
      }
      public ExpressionProtos.ScalarExpressionOrBuilder getOnConditionOrBuilder() {
        return onCondition_;
      }
      
      // optional .apsara.odps.lot.Join.ExecutionType ExeType = 6 [default = Auto];
      public static final int EXETYPE_FIELD_NUMBER = 6;
      private ExecutionType exeType_;
      public boolean hasExeType() {
        return ((bitField0_ & 0x00000020) == 0x00000020);
      }
      public ExecutionType getExeType() {
        return exeType_;
      }
      
      // repeated string SmallParents = 7;
      public static final int SMALLPARENTS_FIELD_NUMBER = 7;
      private com.google.protobuf.LazyStringList smallParents_;
      public java.util.List<String>
          getSmallParentsList() {
        return smallParents_;
      }
      public int getSmallParentsCount() {
        return smallParents_.size();
      }
      public String getSmallParents(int index) {
        return smallParents_.get(index);
      }
      
      private void initFields() {
        id_ = "";
        leftParentId_ = "";
        rightParentId_ = "";
        joinType_ = JoinTypeProtos.JoinType.InnerJoin;
        onCondition_ = ExpressionProtos.ScalarExpression.getDefaultInstance();
        exeType_ = ExecutionType.Auto;
        smallParents_ = com.google.protobuf.LazyStringArrayList.EMPTY;
      }
      private byte memoizedIsInitialized = -1;
      public final boolean isInitialized() {
        byte isInitialized = memoizedIsInitialized;
        if (isInitialized != -1) return isInitialized == 1;
        
        if (!hasId()) {
          memoizedIsInitialized = 0;
          return false;
        }
        if (!hasLeftParentId()) {
          memoizedIsInitialized = 0;
          return false;
        }
        if (!hasRightParentId()) {
          memoizedIsInitialized = 0;
          return false;
        }
        if (!hasJoinType()) {
          memoizedIsInitialized = 0;
          return false;
        }
        if (hasOnCondition()) {
          if (!getOnCondition().isInitialized()) {
            memoizedIsInitialized = 0;
            return false;
          }
        }
        memoizedIsInitialized = 1;
        return true;
      }
      
      public void writeTo(com.google.protobuf.CodedOutputStream output)
                          throws java.io.IOException {
        getSerializedSize();
        if (((bitField0_ & 0x00000001) == 0x00000001)) {
          output.writeBytes(1, getIdBytes());
        }
        if (((bitField0_ & 0x00000002) == 0x00000002)) {
          output.writeBytes(2, getLeftParentIdBytes());
        }
        if (((bitField0_ & 0x00000004) == 0x00000004)) {
          output.writeBytes(3, getRightParentIdBytes());
        }
        if (((bitField0_ & 0x00000008) == 0x00000008)) {
          output.writeEnum(4, joinType_.getNumber());
        }
        if (((bitField0_ & 0x00000010) == 0x00000010)) {
          output.writeMessage(5, onCondition_);
        }
        if (((bitField0_ & 0x00000020) == 0x00000020)) {
          output.writeEnum(6, exeType_.getNumber());
        }
        for (int i = 0; i < smallParents_.size(); i++) {
          output.writeBytes(7, smallParents_.getByteString(i));
        }
        getUnknownFields().writeTo(output);
      }
      
      private int memoizedSerializedSize = -1;
      public int getSerializedSize() {
        int size = memoizedSerializedSize;
        if (size != -1) return size;
      
        size = 0;
        if (((bitField0_ & 0x00000001) == 0x00000001)) {
          size += com.google.protobuf.CodedOutputStream
            .computeBytesSize(1, getIdBytes());
        }
        if (((bitField0_ & 0x00000002) == 0x00000002)) {
          size += com.google.protobuf.CodedOutputStream
            .computeBytesSize(2, getLeftParentIdBytes());
        }
        if (((bitField0_ & 0x00000004) == 0x00000004)) {
          size += com.google.protobuf.CodedOutputStream
            .computeBytesSize(3, getRightParentIdBytes());
        }
        if (((bitField0_ & 0x00000008) == 0x00000008)) {
          size += com.google.protobuf.CodedOutputStream
            .computeEnumSize(4, joinType_.getNumber());
        }
        if (((bitField0_ & 0x00000010) == 0x00000010)) {
          size += com.google.protobuf.CodedOutputStream
            .computeMessageSize(5, onCondition_);
        }
        if (((bitField0_ & 0x00000020) == 0x00000020)) {
          size += com.google.protobuf.CodedOutputStream
            .computeEnumSize(6, exeType_.getNumber());
        }
        {
          int dataSize = 0;
          for (int i = 0; i < smallParents_.size(); i++) {
            dataSize += com.google.protobuf.CodedOutputStream
              .computeBytesSizeNoTag(smallParents_.getByteString(i));
          }
          size += dataSize;
          size += 1 * getSmallParentsList().size();
        }
        size += getUnknownFields().getSerializedSize();
        memoizedSerializedSize = size;
        return size;
      }
      
      private static final long serialVersionUID = 0L;
      @Override
      protected Object writeReplace()
          throws java.io.ObjectStreamException {
        return super.writeReplace();
      }
      
      public static Join parseFrom(
          com.google.protobuf.ByteString data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return newBuilder().mergeFrom(data).buildParsed();
      }
      public static Join parseFrom(
          com.google.protobuf.ByteString data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return newBuilder().mergeFrom(data, extensionRegistry)
                 .buildParsed();
      }
      public static Join parseFrom(byte[] data)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return newBuilder().mergeFrom(data).buildParsed();
      }
      public static Join parseFrom(
          byte[] data,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws com.google.protobuf.InvalidProtocolBufferException {
        return newBuilder().mergeFrom(data, extensionRegistry)
                 .buildParsed();
      }
      public static Join parseFrom(java.io.InputStream input)
          throws java.io.IOException {
        return newBuilder().mergeFrom(input).buildParsed();
      }
      public static Join parseFrom(
          java.io.InputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        return newBuilder().mergeFrom(input, extensionRegistry)
                 .buildParsed();
      }
      public static Join parseDelimitedFrom(java.io.InputStream input)
          throws java.io.IOException {
        Builder builder = newBuilder();
        if (builder.mergeDelimitedFrom(input)) {
          return builder.buildParsed();
        } else {
          return null;
        }
      }
      public static Join parseDelimitedFrom(
          java.io.InputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        Builder builder = newBuilder();
        if (builder.mergeDelimitedFrom(input, extensionRegistry)) {
          return builder.buildParsed();
        } else {
          return null;
        }
      }
      public static Join parseFrom(
          com.google.protobuf.CodedInputStream input)
          throws java.io.IOException {
        return newBuilder().mergeFrom(input).buildParsed();
      }
      public static Join parseFrom(
          com.google.protobuf.CodedInputStream input,
          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
          throws java.io.IOException {
        return newBuilder().mergeFrom(input, extensionRegistry)
                 .buildParsed();
      }
      
      public static Builder newBuilder() { return Builder.create(); }
      public Builder newBuilderForType() { return newBuilder(); }
      public static Builder newBuilder(Join prototype) {
        return newBuilder().mergeFrom(prototype);
      }
      public Builder toBuilder() { return newBuilder(this); }
      
      @Override
      protected Builder newBuilderForType(
          BuilderParent parent) {
        Builder builder = new Builder(parent);
        return builder;
      }
      public static final class Builder extends
          com.google.protobuf.GeneratedMessage.Builder<Builder>
         implements JoinOrBuilder {
        public static final com.google.protobuf.Descriptors.Descriptor
            getDescriptor() {
          return JoinProtos.internal_static_apsara_odps_lot_Join_descriptor;
        }
        
        protected FieldAccessorTable
            internalGetFieldAccessorTable() {
          return JoinProtos.internal_static_apsara_odps_lot_Join_fieldAccessorTable;
        }
        
        // Construct using apsara.odps.lot.JoinProtos.Join.newBuilder()
        private Builder() {
          maybeForceBuilderInitialization();
        }
        
        private Builder(BuilderParent parent) {
          super(parent);
          maybeForceBuilderInitialization();
        }
        private void maybeForceBuilderInitialization() {
          if (com.google.protobuf.GeneratedMessage.alwaysUseFieldBuilders) {
            getOnConditionFieldBuilder();
          }
        }
        private static Builder create() {
          return new Builder();
        }
        
        public Builder clear() {
          super.clear();
          id_ = "";
          bitField0_ = (bitField0_ & ~0x00000001);
          leftParentId_ = "";
          bitField0_ = (bitField0_ & ~0x00000002);
          rightParentId_ = "";
          bitField0_ = (bitField0_ & ~0x00000004);
          joinType_ = JoinTypeProtos.JoinType.InnerJoin;
          bitField0_ = (bitField0_ & ~0x00000008);
          if (onConditionBuilder_ == null) {
            onCondition_ = ExpressionProtos.ScalarExpression.getDefaultInstance();
          } else {
            onConditionBuilder_.clear();
          }
          bitField0_ = (bitField0_ & ~0x00000010);
          exeType_ = ExecutionType.Auto;
          bitField0_ = (bitField0_ & ~0x00000020);
          smallParents_ = com.google.protobuf.LazyStringArrayList.EMPTY;
          bitField0_ = (bitField0_ & ~0x00000040);
          return this;
        }
        
        public Builder clone() {
          return create().mergeFrom(buildPartial());
        }
        
        public com.google.protobuf.Descriptors.Descriptor
            getDescriptorForType() {
          return Join.getDescriptor();
        }
        
        public Join getDefaultInstanceForType() {
          return Join.getDefaultInstance();
        }
        
        public Join build() {
          Join result = buildPartial();
          if (!result.isInitialized()) {
            throw newUninitializedMessageException(result);
          }
          return result;
        }
        
        private Join buildParsed()
            throws com.google.protobuf.InvalidProtocolBufferException {
          Join result = buildPartial();
          if (!result.isInitialized()) {
            throw newUninitializedMessageException(
              result).asInvalidProtocolBufferException();
          }
          return result;
        }
        
        public Join buildPartial() {
          Join result = new Join(this);
          int from_bitField0_ = bitField0_;
          int to_bitField0_ = 0;
          if (((from_bitField0_ & 0x00000001) == 0x00000001)) {
            to_bitField0_ |= 0x00000001;
          }
          result.id_ = id_;
          if (((from_bitField0_ & 0x00000002) == 0x00000002)) {
            to_bitField0_ |= 0x00000002;
          }
          result.leftParentId_ = leftParentId_;
          if (((from_bitField0_ & 0x00000004) == 0x00000004)) {
            to_bitField0_ |= 0x00000004;
          }
          result.rightParentId_ = rightParentId_;
          if (((from_bitField0_ & 0x00000008) == 0x00000008)) {
            to_bitField0_ |= 0x00000008;
          }
          result.joinType_ = joinType_;
          if (((from_bitField0_ & 0x00000010) == 0x00000010)) {
            to_bitField0_ |= 0x00000010;
          }
          if (onConditionBuilder_ == null) {
            result.onCondition_ = onCondition_;
          } else {
            result.onCondition_ = onConditionBuilder_.build();
          }
          if (((from_bitField0_ & 0x00000020) == 0x00000020)) {
            to_bitField0_ |= 0x00000020;
          }
          result.exeType_ = exeType_;
          if (((bitField0_ & 0x00000040) == 0x00000040)) {
            smallParents_ = new com.google.protobuf.UnmodifiableLazyStringList(
                smallParents_);
            bitField0_ = (bitField0_ & ~0x00000040);
          }
          result.smallParents_ = smallParents_;
          result.bitField0_ = to_bitField0_;
          onBuilt();
          return result;
        }
        
        public Builder mergeFrom(com.google.protobuf.Message other) {
          if (other instanceof Join) {
            return mergeFrom((Join)other);
          } else {
            super.mergeFrom(other);
            return this;
          }
        }
        
        public Builder mergeFrom(Join other) {
          if (other == Join.getDefaultInstance()) return this;
          if (other.hasId()) {
            setId(other.getId());
          }
          if (other.hasLeftParentId()) {
            setLeftParentId(other.getLeftParentId());
          }
          if (other.hasRightParentId()) {
            setRightParentId(other.getRightParentId());
          }
          if (other.hasJoinType()) {
            setJoinType(other.getJoinType());
          }
          if (other.hasOnCondition()) {
            mergeOnCondition(other.getOnCondition());
          }
          if (other.hasExeType()) {
            setExeType(other.getExeType());
          }
          if (!other.smallParents_.isEmpty()) {
            if (smallParents_.isEmpty()) {
              smallParents_ = other.smallParents_;
              bitField0_ = (bitField0_ & ~0x00000040);
            } else {
              ensureSmallParentsIsMutable();
              smallParents_.addAll(other.smallParents_);
            }
            onChanged();
          }
          this.mergeUnknownFields(other.getUnknownFields());
          return this;
        }
        
        public final boolean isInitialized() {
          if (!hasId()) {
            
            return false;
          }
          if (!hasLeftParentId()) {
            
            return false;
          }
          if (!hasRightParentId()) {
            
            return false;
          }
          if (!hasJoinType()) {
            
            return false;
          }
          if (hasOnCondition()) {
            if (!getOnCondition().isInitialized()) {
              
              return false;
            }
          }
          return true;
        }
        
        public Builder mergeFrom(
            com.google.protobuf.CodedInputStream input,
            com.google.protobuf.ExtensionRegistryLite extensionRegistry)
            throws java.io.IOException {
          com.google.protobuf.UnknownFieldSet.Builder unknownFields =
            com.google.protobuf.UnknownFieldSet.newBuilder(
              this.getUnknownFields());
          while (true) {
            int tag = input.readTag();
            switch (tag) {
              case 0:
                this.setUnknownFields(unknownFields.build());
                onChanged();
                return this;
              default: {
                if (!parseUnknownField(input, unknownFields,
                                       extensionRegistry, tag)) {
                  this.setUnknownFields(unknownFields.build());
                  onChanged();
                  return this;
                }
                break;
              }
              case 10: {
                bitField0_ |= 0x00000001;
                id_ = input.readBytes();
                break;
              }
              case 18: {
                bitField0_ |= 0x00000002;
                leftParentId_ = input.readBytes();
                break;
              }
              case 26: {
                bitField0_ |= 0x00000004;
                rightParentId_ = input.readBytes();
                break;
              }
              case 32: {
                int rawValue = input.readEnum();
                JoinTypeProtos.JoinType value = JoinTypeProtos.JoinType.valueOf(rawValue);
                if (value == null) {
                  unknownFields.mergeVarintField(4, rawValue);
                } else {
                  bitField0_ |= 0x00000008;
                  joinType_ = value;
                }
                break;
              }
              case 42: {
                ExpressionProtos.ScalarExpression.Builder subBuilder = ExpressionProtos.ScalarExpression.newBuilder();
                if (hasOnCondition()) {
                  subBuilder.mergeFrom(getOnCondition());
                }
                input.readMessage(subBuilder, extensionRegistry);
                setOnCondition(subBuilder.buildPartial());
                break;
              }
              case 48: {
                int rawValue = input.readEnum();
                ExecutionType value = ExecutionType.valueOf(rawValue);
                if (value == null) {
                  unknownFields.mergeVarintField(6, rawValue);
                } else {
                  bitField0_ |= 0x00000020;
                  exeType_ = value;
                }
                break;
              }
              case 58: {
                ensureSmallParentsIsMutable();
                smallParents_.add(input.readBytes());
                break;
              }
            }
          }
        }
        
        private int bitField0_;
        
        // required string Id = 1;
        private Object id_ = "";
        public boolean hasId() {
          return ((bitField0_ & 0x00000001) == 0x00000001);
        }
        public String getId() {
          Object ref = id_;
          if (!(ref instanceof String)) {
            String s = ((com.google.protobuf.ByteString) ref).toStringUtf8();
            id_ = s;
            return s;
          } else {
            return (String) ref;
          }
        }
        public Builder setId(String value) {
          if (value == null) {
      throw new NullPointerException();
    }
    bitField0_ |= 0x00000001;
          id_ = value;
          onChanged();
          return this;
        }
        public Builder clearId() {
          bitField0_ = (bitField0_ & ~0x00000001);
          id_ = getDefaultInstance().getId();
          onChanged();
          return this;
        }
        void setId(com.google.protobuf.ByteString value) {
          bitField0_ |= 0x00000001;
          id_ = value;
          onChanged();
        }
        
        // required string LeftParentId = 2;
        private Object leftParentId_ = "";
        public boolean hasLeftParentId() {
          return ((bitField0_ & 0x00000002) == 0x00000002);
        }
        public String getLeftParentId() {
          Object ref = leftParentId_;
          if (!(ref instanceof String)) {
            String s = ((com.google.protobuf.ByteString) ref).toStringUtf8();
            leftParentId_ = s;
            return s;
          } else {
            return (String) ref;
          }
        }
        public Builder setLeftParentId(String value) {
          if (value == null) {
      throw new NullPointerException();
    }
    bitField0_ |= 0x00000002;
          leftParentId_ = value;
          onChanged();
          return this;
        }
        public Builder clearLeftParentId() {
          bitField0_ = (bitField0_ & ~0x00000002);
          leftParentId_ = getDefaultInstance().getLeftParentId();
          onChanged();
          return this;
        }
        void setLeftParentId(com.google.protobuf.ByteString value) {
          bitField0_ |= 0x00000002;
          leftParentId_ = value;
          onChanged();
        }
        
        // required string RightParentId = 3;
        private Object rightParentId_ = "";
        public boolean hasRightParentId() {
          return ((bitField0_ & 0x00000004) == 0x00000004);
        }
        public String getRightParentId() {
          Object ref = rightParentId_;
          if (!(ref instanceof String)) {
            String s = ((com.google.protobuf.ByteString) ref).toStringUtf8();
            rightParentId_ = s;
            return s;
          } else {
            return (String) ref;
          }
        }
        public Builder setRightParentId(String value) {
          if (value == null) {
      throw new NullPointerException();
    }
    bitField0_ |= 0x00000004;
          rightParentId_ = value;
          onChanged();
          return this;
        }
        public Builder clearRightParentId() {
          bitField0_ = (bitField0_ & ~0x00000004);
          rightParentId_ = getDefaultInstance().getRightParentId();
          onChanged();
          return this;
        }
        void setRightParentId(com.google.protobuf.ByteString value) {
          bitField0_ |= 0x00000004;
          rightParentId_ = value;
          onChanged();
        }
        
        // required .apsara.odps.JoinType JoinType = 4;
        private JoinTypeProtos.JoinType joinType_ = JoinTypeProtos.JoinType.InnerJoin;
        public boolean hasJoinType() {
          return ((bitField0_ & 0x00000008) == 0x00000008);
        }
        public JoinTypeProtos.JoinType getJoinType() {
          return joinType_;
        }
        public Builder setJoinType(JoinTypeProtos.JoinType value) {
          if (value == null) {
            throw new NullPointerException();
          }
          bitField0_ |= 0x00000008;
          joinType_ = value;
          onChanged();
          return this;
        }
        public Builder clearJoinType() {
          bitField0_ = (bitField0_ & ~0x00000008);
          joinType_ = JoinTypeProtos.JoinType.InnerJoin;
          onChanged();
          return this;
        }
        
        // optional .apsara.odps.lot.ScalarExpression OnCondition = 5;
        private ExpressionProtos.ScalarExpression onCondition_ = ExpressionProtos.ScalarExpression.getDefaultInstance();
        private com.google.protobuf.SingleFieldBuilder<
            ExpressionProtos.ScalarExpression, ExpressionProtos.ScalarExpression.Builder, ExpressionProtos.ScalarExpressionOrBuilder> onConditionBuilder_;
        public boolean hasOnCondition() {
          return ((bitField0_ & 0x00000010) == 0x00000010);
        }
        public ExpressionProtos.ScalarExpression getOnCondition() {
          if (onConditionBuilder_ == null) {
            return onCondition_;
          } else {
            return onConditionBuilder_.getMessage();
          }
        }
        public Builder setOnCondition(ExpressionProtos.ScalarExpression value) {
          if (onConditionBuilder_ == null) {
            if (value == null) {
              throw new NullPointerException();
            }
            onCondition_ = value;
            onChanged();
          } else {
            onConditionBuilder_.setMessage(value);
          }
          bitField0_ |= 0x00000010;
          return this;
        }
        public Builder setOnCondition(
            ExpressionProtos.ScalarExpression.Builder builderForValue) {
          if (onConditionBuilder_ == null) {
            onCondition_ = builderForValue.build();
            onChanged();
          } else {
            onConditionBuilder_.setMessage(builderForValue.build());
          }
          bitField0_ |= 0x00000010;
          return this;
        }
        public Builder mergeOnCondition(ExpressionProtos.ScalarExpression value) {
          if (onConditionBuilder_ == null) {
            if (((bitField0_ & 0x00000010) == 0x00000010) &&
                onCondition_ != ExpressionProtos.ScalarExpression.getDefaultInstance()) {
              onCondition_ =
                ExpressionProtos.ScalarExpression.newBuilder(onCondition_).mergeFrom(value).buildPartial();
            } else {
              onCondition_ = value;
            }
            onChanged();
          } else {
            onConditionBuilder_.mergeFrom(value);
          }
          bitField0_ |= 0x00000010;
          return this;
        }
        public Builder clearOnCondition() {
          if (onConditionBuilder_ == null) {
            onCondition_ = ExpressionProtos.ScalarExpression.getDefaultInstance();
            onChanged();
          } else {
            onConditionBuilder_.clear();
          }
          bitField0_ = (bitField0_ & ~0x00000010);
          return this;
        }
        public ExpressionProtos.ScalarExpression.Builder getOnConditionBuilder() {
          bitField0_ |= 0x00000010;
          onChanged();
          return getOnConditionFieldBuilder().getBuilder();
        }
        public ExpressionProtos.ScalarExpressionOrBuilder getOnConditionOrBuilder() {
          if (onConditionBuilder_ != null) {
            return onConditionBuilder_.getMessageOrBuilder();
          } else {
            return onCondition_;
          }
        }
        private com.google.protobuf.SingleFieldBuilder<
            ExpressionProtos.ScalarExpression, ExpressionProtos.ScalarExpression.Builder, ExpressionProtos.ScalarExpressionOrBuilder>
            getOnConditionFieldBuilder() {
          if (onConditionBuilder_ == null) {
            onConditionBuilder_ = new com.google.protobuf.SingleFieldBuilder<
                ExpressionProtos.ScalarExpression, ExpressionProtos.ScalarExpression.Builder, ExpressionProtos.ScalarExpressionOrBuilder>(
                    onCondition_,
                    getParentForChildren(),
                    isClean());
            onCondition_ = null;
          }
          return onConditionBuilder_;
        }
        
        // optional .apsara.odps.lot.Join.ExecutionType ExeType = 6 [default = Auto];
        private ExecutionType exeType_ = ExecutionType.Auto;
        public boolean hasExeType() {
          return ((bitField0_ & 0x00000020) == 0x00000020);
        }
        public ExecutionType getExeType() {
          return exeType_;
        }
        public Builder setExeType(ExecutionType value) {
          if (value == null) {
            throw new NullPointerException();
          }
          bitField0_ |= 0x00000020;
          exeType_ = value;
          onChanged();
          return this;
        }
        public Builder clearExeType() {
          bitField0_ = (bitField0_ & ~0x00000020);
          exeType_ = ExecutionType.Auto;
          onChanged();
          return this;
        }
        
        // repeated string SmallParents = 7;
        private com.google.protobuf.LazyStringList smallParents_ = com.google.protobuf.LazyStringArrayList.EMPTY;
        private void ensureSmallParentsIsMutable() {
          if (!((bitField0_ & 0x00000040) == 0x00000040)) {
            smallParents_ = new com.google.protobuf.LazyStringArrayList(smallParents_);
            bitField0_ |= 0x00000040;
           }
        }
        public java.util.List<String>
            getSmallParentsList() {
          return java.util.Collections.unmodifiableList(smallParents_);
        }
        public int getSmallParentsCount() {
          return smallParents_.size();
        }
        public String getSmallParents(int index) {
          return smallParents_.get(index);
        }
        public Builder setSmallParents(
            int index, String value) {
          if (value == null) {
      throw new NullPointerException();
    }
    ensureSmallParentsIsMutable();
          smallParents_.set(index, value);
          onChanged();
          return this;
        }
        public Builder addSmallParents(String value) {
          if (value == null) {
      throw new NullPointerException();
    }
    ensureSmallParentsIsMutable();
          smallParents_.add(value);
          onChanged();
          return this;
        }
        public Builder addAllSmallParents(
            Iterable<String> values) {
          ensureSmallParentsIsMutable();
          super.addAll(values, smallParents_);
          onChanged();
          return this;
        }
        public Builder clearSmallParents() {
          smallParents_ = com.google.protobuf.LazyStringArrayList.EMPTY;
          bitField0_ = (bitField0_ & ~0x00000040);
          onChanged();
          return this;
        }
        void addSmallParents(com.google.protobuf.ByteString value) {
          ensureSmallParentsIsMutable();
          smallParents_.add(value);
          onChanged();
        }
        
        // @@protoc_insertion_point(builder_scope:apsara.odps.lot.Join)
      }
      
      static {
        defaultInstance = new Join(true);
        defaultInstance.initFields();
      }
      
      // @@protoc_insertion_point(class_scope:apsara.odps.lot.Join)
    }
    
    private static com.google.protobuf.Descriptors.Descriptor
      internal_static_apsara_odps_lot_Join_descriptor;
    private static
      com.google.protobuf.GeneratedMessage.FieldAccessorTable
        internal_static_apsara_odps_lot_Join_fieldAccessorTable;
    
    public static com.google.protobuf.Descriptors.FileDescriptor
        getDescriptor() {
      return descriptor;
    }
    private static com.google.protobuf.Descriptors.FileDescriptor
        descriptor;
    static {
      String[] descriptorData = {
        "\n\016lot/join.proto\022\017apsara.odps.lot\032\027commo" +
        "n/expression.proto\032\025common/jointype.prot" +
        "o\032\024lot/expression.proto\"\304\002\n\004Join\022\n\n\002Id\030\001" +
        " \002(\t\022\024\n\014LeftParentId\030\002 \002(\t\022\025\n\rRightParen" +
        "tId\030\003 \002(\t\022\'\n\010JoinType\030\004 \002(\0162\025.apsara.odp" +
        "s.JoinType\0226\n\013OnCondition\030\005 \001(\0132!.apsara" +
        ".odps.lot.ScalarExpression\022:\n\007ExeType\030\006 " +
        "\001(\0162#.apsara.odps.lot.Join.ExecutionType" +
        ":\004Auto\022\024\n\014SmallParents\030\007 \003(\t\"P\n\rExecutio" +
        "nType\022\010\n\004Auto\020\000\022\r\n\tMergeJoin\020\001\022\020\n\014FullHa",
        "shJoin\020\002\022\024\n\020ShuffledHashJoin\020\003B\014B\nJoinPr" +
        "otos"
      };
      com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
        new com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner() {
          public com.google.protobuf.ExtensionRegistry assignDescriptors(
              com.google.protobuf.Descriptors.FileDescriptor root) {
            descriptor = root;
            internal_static_apsara_odps_lot_Join_descriptor =
              getDescriptor().getMessageTypes().get(0);
            internal_static_apsara_odps_lot_Join_fieldAccessorTable = new
              com.google.protobuf.GeneratedMessage.FieldAccessorTable(
                internal_static_apsara_odps_lot_Join_descriptor,
                new String[] { "Id", "LeftParentId", "RightParentId", "JoinType", "OnCondition", "ExeType", "SmallParents", },
                Join.class,
                Join.Builder.class);
            return null;
          }
        };
      com.google.protobuf.Descriptors.FileDescriptor
        .internalBuildGeneratedFileFrom(descriptorData,
          new com.google.protobuf.Descriptors.FileDescriptor[] {
            apsara.odps.ExpressionProtos.getDescriptor(),
            JoinTypeProtos.getDescriptor(),
            ExpressionProtos.getDescriptor(),
          }, assigner);
    }
    
    // @@protoc_insertion_point(outer_class_scope)
  }
  