blob: 308dcdb9ae17a4fed6a6fa642daa0acb738405bd [file] [log] [blame]
// 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.
include "../../format/Schema.fbs";
include "Literal.fbs";
include "Expression.fbs";
namespace org.apache.arrow.computeir.flatbuf;
/// An identifier for relations in a query.
///
/// A table is used here to allow plan implementations optionality.
table RelId {
id: uint64;
}
/// Filter operation
table Filter {
/// An identifiier for the relation. The identifier should be unique over the
/// entire plan. Optional.
id: RelId;
/// Child relation
rel: Relation (required);
/// The expression which will be evaluated against input rows
/// to determine whether they should be excluded from the
/// filter relation's output.
predicate: Expression (required);
}
/// Projection
table Project {
/// An identifiier for the relation. The identifier should be unique over the
/// entire plan. Optional.
id: RelId;
/// Child relation
rel: Relation (required);
/// Expressions which will be evaluated to produce to
/// the rows of the project relation's output.
expressions: [Expression] (required);
}
/// A set of grouping keys
table Grouping {
/// Expressions to group by
keys: [Expression] (required);
}
/// Aggregate operation
table Aggregate {
/// An identifiier for the relation. The identifier should be unique over the
/// entire plan. Optional.
id: RelId;
/// Child relation
rel: Relation (required);
/// Expressions which will be evaluated to produce to
/// the rows of the aggregate relation's output.
measures: [Expression] (required);
/// Keys by which `aggregations` will be grouped.
///
/// The nested list here is to support grouping sets
/// eg
///
/// SELECT a, b, c, sum(d)
/// FROM t
/// GROUP BY
/// GROUPING SETS (
/// (a, b, c),
/// (a, b),
/// (a),
/// ()
/// );
groupings: [Grouping] (required);
}
enum JoinKind : uint8 {
Anti,
Cross,
FullOuter,
Inner,
LeftOuter,
LeftSemi,
RightOuter,
}
/// Join between two tables
table Join {
/// An identifiier for the relation. The identifier should be unique over the
/// entire plan. Optional.
id: RelId;
/// Left relation
left: Relation (required);
/// Right relation
right: Relation (required);
/// The expression which will be evaluated against rows from each
/// input to determine whether they should be included in the
/// join relation's output.
on_expression: Expression (required);
/// The kind of join to use.
join_kind: JoinKind;
}
/// Order by relation
table OrderBy {
/// An identifiier for the relation. The identifier should be unique over the
/// entire plan. Optional.
id: RelId;
/// Child relation
rel: Relation (required);
/// Define sort order for rows of output.
/// Keys with higher precedence are ordered ahead of other keys.
keys: [SortKey] (required);
}
/// Limit operation
table Limit {
/// An identifiier for the relation. The identifier should be unique over the
/// entire plan. Optional.
id: RelId;
/// Child relation
rel: Relation (required);
/// Starting index of rows
offset: uint32;
/// The maximum number of rows of output.
count: uint32;
}
/// The kind of set operation being performed.
enum SetOpKind : uint8 {
Union,
Intersection,
Difference,
}
/// A set operation on two or more relations
table SetOperation {
/// An identifiier for the relation. The identifier should be unique over the
/// entire plan. Optional.
id: RelId;
/// Child relations
rels: [Relation] (required);
/// The kind of set operation
set_op: SetOpKind;
}
/// A single column of literal values.
table LiteralColumn {
/// The literal values of the column
elements: [Literal] (required);
}
/// Literal relation
table LiteralRelation {
/// An identifiier for the relation. The identifier should be unique over the
/// entire plan. Optional.
id: RelId;
/// The columns of this literal relation.
columns: [LiteralColumn] (required);
}
/// An external source of tabular data
table Source {
/// An identifiier for the relation. The identifier should be unique over the
/// entire plan. Optional.
id: RelId;
name: string (required);
/// An optional expression used to filter out rows directly from the source.
///
/// Useful for consumers that implement predicate pushdown.
///
/// A missing filter value indicates no filter, i.e., all rows are
/// returned from the source.
filter: Expression;
/// Schemas are explicitly optional
schema: org.apache.arrow.flatbuf.Schema;
/// An optional list of field indices indicating which columns should be read
/// from the source. Columns excluded from this listing will instead be replaced
/// with all-null placeholders to guarantee that the schema of the source is
/// unaffected by this projection.
///
/// A missing value indicates all columns should be read.
///
/// The behavior of an empty list is undefined.
projection: [FieldIndex];
}
/// The varieties of relations
union RelationImpl {
Aggregate,
Filter,
Join,
Limit,
LiteralRelation,
OrderBy,
Project,
SetOperation,
Source,
}
/// A table holding an instance of the possible relation types.
table Relation {
impl: RelationImpl (required);
}
root_type Relation;