//   Copyright 2011-2015 Quickstep Technologies LLC.
//   Copyright 2015 Pivotal Software, Inc.
//
//   Licensed 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.

syntax = "proto2";

package quickstep.serialization;

import "types/Type.proto";
import "types/TypedValue.proto";
import "types/operations/Operation.proto";

// ----------------------------------------------------------------------------
// Base message types.

message Predicate {
  enum PredicateType {
    TRUE = 0;
    FALSE = 1;
    COMPARISON = 2;
    NEGATION = 3;
    CONJUNCTION = 4;
    DISJUNCTION = 5;
  }

  required PredicateType predicate_type = 1;

  // The convention for extension numbering is that extensions for a particular
  // PredicateType should begin from (predicate_type + 1) * 32.
  extensions 32 to max;
}

message Scalar {
  enum ScalarDataSource {
    LITERAL = 0;
    ATTRIBUTE = 1;
    UNARY_EXPRESSION = 2;
    BINARY_EXPRESSION = 3;
    CASE_EXPRESSION = 4;
  }

  required ScalarDataSource data_source = 1;

  // The convention for extension numbering is that extensions for a particular
  // ScalarDataSource should begin from (data_source + 1) * 32.
  extensions 32 to max;
}

// ----------------------------------------------------------------------------
// Extensions for Predicate.

message ComparisonPredicate {
  extend Predicate {
    optional Comparison comparison = 96;
    optional Scalar left_operand = 97;
    optional Scalar right_operand = 98;
  }
}

message NegationPredicate {
  extend Predicate {
    optional Predicate operand = 128;
  }
}

// Either ConjunctionPredicate or DisjunctionPredicate.
message PredicateWithList {
  extend Predicate {
    repeated Predicate operands = 160;
  }
}

// ----------------------------------------------------------------------------
// Extensions for Scalar.

message ScalarLiteral {
  extend Scalar {
    optional TypedValue literal = 32;
    optional Type literal_type = 33;
  }
}

message ScalarAttribute {
  extend Scalar {
    optional int32 relation_id = 64;
    optional int32 attribute_id = 65;
  }
}

message ScalarUnaryExpression {
  extend Scalar {
    optional UnaryOperation operation = 96;
    optional Scalar operand = 97;
  }
}

message ScalarBinaryExpression {
  extend Scalar {
    optional BinaryOperation operation = 128;
    optional Scalar left_operand = 129;
    optional Scalar right_operand = 130;
  }
}

message ScalarCaseExpression {
  extend Scalar {
    optional Type result_type = 160;
    repeated Predicate when_predicate = 161;
    repeated Scalar result_expression = 162;
    optional Scalar else_result_expression = 163;
  }
}
