// Copyright 2016 Google 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 = "proto3";

package google.datastore.v1beta3;

import "google/api/annotations.proto";
import "google/datastore/v1beta3/entity.proto";
import "google/protobuf/wrappers.proto";
import "google/type/latlng.proto";

option csharp_namespace = "Google.Cloud.Datastore.V1Beta3";
option go_package = "google.golang.org/genproto/googleapis/datastore/v1beta3;datastore";
option java_multiple_files = true;
option java_outer_classname = "QueryProto";
option java_package = "com.google.datastore.v1beta3";


// The result of fetching an entity from Datastore.
message EntityResult {
  // Specifies what data the 'entity' field contains.
  // A `ResultType` is either implied (for example, in `LookupResponse.missing`
  // from `datastore.proto`, it is always `KEY_ONLY`) or specified by context
  // (for example, in message `QueryResultBatch`, field `entity_result_type`
  // specifies a `ResultType` for all the values in field `entity_results`).
  enum ResultType {
    // Unspecified. This value is never used.
    RESULT_TYPE_UNSPECIFIED = 0;

    // The key and properties.
    FULL = 1;

    // A projected subset of properties. The entity may have no key.
    PROJECTION = 2;

    // Only the key.
    KEY_ONLY = 3;
  }

  // The resulting entity.
  Entity entity = 1;

  // The version of the entity, a strictly positive number that monotonically
  // increases with changes to the entity.
  //
  // This field is set for [`FULL`][google.datastore.v1beta3.EntityResult.ResultType.FULL] entity
  // results.
  //
  // For [missing][google.datastore.v1beta3.LookupResponse.missing] entities in `LookupResponse`, this
  // is the version of the snapshot that was used to look up the entity, and it
  // is always set except for eventually consistent reads.
  int64 version = 4;

  // A cursor that points to the position after the result entity.
  // Set only when the `EntityResult` is part of a `QueryResultBatch` message.
  bytes cursor = 3;
}

// A query for entities.
message Query {
  // The projection to return. Defaults to returning all properties.
  repeated Projection projection = 2;

  // The kinds to query (if empty, returns entities of all kinds).
  // Currently at most 1 kind may be specified.
  repeated KindExpression kind = 3;

  // The filter to apply.
  Filter filter = 4;

  // The order to apply to the query results (if empty, order is unspecified).
  repeated PropertyOrder order = 5;

  // The properties to make distinct. The query results will contain the first
  // result for each distinct combination of values for the given properties
  // (if empty, all results are returned).
  repeated PropertyReference distinct_on = 6;

  // A starting point for the query results. Query cursors are
  // returned in query result batches and
  // [can only be used to continue the same query](https://cloud.google.com/datastore/docs/concepts/queries#cursors_limits_and_offsets).
  bytes start_cursor = 7;

  // An ending point for the query results. Query cursors are
  // returned in query result batches and
  // [can only be used to limit the same query](https://cloud.google.com/datastore/docs/concepts/queries#cursors_limits_and_offsets).
  bytes end_cursor = 8;

  // The number of results to skip. Applies before limit, but after all other
  // constraints. Optional. Must be >= 0 if specified.
  int32 offset = 10;

  // The maximum number of results to return. Applies after all other
  // constraints. Optional.
  // Unspecified is interpreted as no limit.
  // Must be >= 0 if specified.
  google.protobuf.Int32Value limit = 12;
}

// A representation of a kind.
message KindExpression {
  // The name of the kind.
  string name = 1;
}

// A reference to a property relative to the kind expressions.
message PropertyReference {
  // The name of the property.
  // If name includes "."s, it may be interpreted as a property name path.
  string name = 2;
}

// A representation of a property in a projection.
message Projection {
  // The property to project.
  PropertyReference property = 1;
}

// The desired order for a specific property.
message PropertyOrder {
  // The sort direction.
  enum Direction {
    // Unspecified. This value must not be used.
    DIRECTION_UNSPECIFIED = 0;

    // Ascending.
    ASCENDING = 1;

    // Descending.
    DESCENDING = 2;
  }

  // The property to order by.
  PropertyReference property = 1;

  // The direction to order by. Defaults to `ASCENDING`.
  Direction direction = 2;
}

// A holder for any type of filter.
message Filter {
  // The type of filter.
  oneof filter_type {
    // A composite filter.
    CompositeFilter composite_filter = 1;

    // A filter on a property.
    PropertyFilter property_filter = 2;
  }
}

// A filter that merges multiple other filters using the given operator.
message CompositeFilter {
  // A composite filter operator.
  enum Operator {
    // Unspecified. This value must not be used.
    OPERATOR_UNSPECIFIED = 0;

    // The results are required to satisfy each of the combined filters.
    AND = 1;
  }

  // The operator for combining multiple filters.
  Operator op = 1;

  // The list of filters to combine.
  // Must contain at least one filter.
  repeated Filter filters = 2;
}

// A filter on a specific property.
message PropertyFilter {
  // A property filter operator.
  enum Operator {
    // Unspecified. This value must not be used.
    OPERATOR_UNSPECIFIED = 0;

    // Less than.
    LESS_THAN = 1;

    // Less than or equal.
    LESS_THAN_OR_EQUAL = 2;

    // Greater than.
    GREATER_THAN = 3;

    // Greater than or equal.
    GREATER_THAN_OR_EQUAL = 4;

    // Equal.
    EQUAL = 5;

    // Has ancestor.
    HAS_ANCESTOR = 11;
  }

  // The property to filter by.
  PropertyReference property = 1;

  // The operator to filter by.
  Operator op = 2;

  // The value to compare the property to.
  Value value = 3;
}

// A [GQL query](https://cloud.google.com/datastore/docs/apis/gql/gql_reference).
message GqlQuery {
  // A string of the format described
  // [here](https://cloud.google.com/datastore/docs/apis/gql/gql_reference).
  string query_string = 1;

  // When false, the query string must not contain any literals and instead must
  // bind all values. For example,
  // `SELECT * FROM Kind WHERE a = 'string literal'` is not allowed, while
  // `SELECT * FROM Kind WHERE a = @value` is.
  bool allow_literals = 2;

  // For each non-reserved named binding site in the query string, there must be
  // a named parameter with that name, but not necessarily the inverse.
  //
  // Key must match regex `[A-Za-z_$][A-Za-z_$0-9]*`, must not match regex
  // `__.*__`, and must not be `""`.
  map<string, GqlQueryParameter> named_bindings = 5;

  // Numbered binding site @1 references the first numbered parameter,
  // effectively using 1-based indexing, rather than the usual 0.
  //
  // For each binding site numbered i in `query_string`, there must be an i-th
  // numbered parameter. The inverse must also be true.
  repeated GqlQueryParameter positional_bindings = 4;
}

// A binding parameter for a GQL query.
message GqlQueryParameter {
  // The type of parameter.
  oneof parameter_type {
    // A value parameter.
    Value value = 2;

    // A query cursor. Query cursors are returned in query
    // result batches.
    bytes cursor = 3;
  }
}

// A batch of results produced by a query.
message QueryResultBatch {
  // The possible values for the `more_results` field.
  enum MoreResultsType {
    // Unspecified. This value is never used.
    MORE_RESULTS_TYPE_UNSPECIFIED = 0;

    // There may be additional batches to fetch from this query.
    NOT_FINISHED = 1;

    // The query is finished, but there may be more results after the limit.
    MORE_RESULTS_AFTER_LIMIT = 2;

    // The query is finished, but there may be more results after the end
    // cursor.
    MORE_RESULTS_AFTER_CURSOR = 4;

    // The query has been exhausted.
    NO_MORE_RESULTS = 3;
  }

  // The number of results skipped, typically because of an offset.
  int32 skipped_results = 6;

  // A cursor that points to the position after the last skipped result.
  // Will be set when `skipped_results` != 0.
  bytes skipped_cursor = 3;

  // The result type for every entity in `entity_results`.
  EntityResult.ResultType entity_result_type = 1;

  // The results for this batch.
  repeated EntityResult entity_results = 2;

  // A cursor that points to the position after the last result in the batch.
  bytes end_cursor = 4;

  // The state of the query after the current batch.
  MoreResultsType more_results = 5;

  // The version number of the snapshot this batch was returned from.
  // This applies to the range of results from the query's `start_cursor` (or
  // the beginning of the query if no cursor was given) to this batch's
  // `end_cursor` (not the query's `end_cursor`).
  //
  // In a single transaction, subsequent query result batches for the same query
  // can have a greater snapshot version number. Each batch's snapshot version
  // is valid for all preceding batches.
  // The value will be zero for eventually consistent queries.
  int64 snapshot_version = 7;
}
