// 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.

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;
    SHARED_EXPRESSION = 5;
  }

  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 {
  enum JoinSide {
    NONE = 0;
    LEFT_SIDE = 1;
    RIGHT_SIDE = 2;
  }

  extend Scalar {
    optional int32 relation_id = 64;
    optional int32 attribute_id = 65;
    optional JoinSide join_side = 66;
  }
}

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;
  }
}

message ScalarSharedExpression {
  extend Scalar {
    optional int32 share_id = 196;
    optional Scalar operand = 197;
  }
}
