// Copyright 2013 Google Inc. All Rights Reserved.
//
// The datastore v1 service proto definitions

syntax = "proto2";

package datastore;
option java_package = "com.google.api.services.datastore";


// An identifier for a particular subset of entities.
//
// Entities are partitioned into various subsets, each used by different
// datasets and different namespaces within a dataset and so forth.
//
// All input partition IDs are normalized before use.
// A partition ID is normalized as follows:
//   If the partition ID is unset or is set to an empty partition ID, replace it
//       with the context partition ID.
//   Otherwise, if the partition ID has no dataset ID, assign it the context
//       partition ID's dataset ID.
// Unless otherwise documented, the context partition ID has the dataset ID set
// to the context dataset ID and no other partition dimension set.
//
// A partition ID is empty if all of its fields are unset.
//
// Partition dimension:
// A dimension may be unset.
// A dimension's value must never be "".
// A dimension's value must match [A-Za-z\d\.\-_]{1,100}
// If the value of any dimension matches regex "__.*__",
// the partition is reserved/read-only.
// A reserved/read-only partition ID is forbidden in certain documented contexts.
//
// Dataset ID:
// A dataset id's value must never be "".
// A dataset id's value must match
// ([a-z\d\-]{1,100}~)?([a-z\d][a-z\d\-\.]{0,99}:)?([a-z\d][a-z\d\-]{0,99}
message PartitionId {
  // The dataset ID.
  optional string dataset_id = 3;
  // The namespace.
  optional string namespace = 4;
}

// A unique identifier for an entity.
// If a key's partition id or any of its path kinds or names are
// reserved/read-only, the key is reserved/read-only.
// A reserved/read-only key is forbidden in certain documented contexts.
message Key {
  // Entities are partitioned into subsets, currently identified by a dataset
  // (usually implicitly specified by the project) and namespace ID.
  // Queries are scoped to a single partition.
  optional PartitionId partition_id = 1;

  // A (kind, ID/name) pair used to construct a key path.
  //
  // At most one of name or ID may be set.
  // If either is set, the element is complete.
  // If neither is set, the element is incomplete.
  message PathElement {
    // The kind of the entity.
    // A kind matching regex "__.*__" is reserved/read-only.
    // A kind must not contain more than 500 characters.
    // Cannot be "".
    required string kind = 1;
    // The ID of the entity.
    // Never equal to zero. Values less than zero are discouraged and will not
    // be supported in the future.
    optional int64 id = 2;
    // The name of the entity.
    // A name matching regex "__.*__" is reserved/read-only.
    // A name must not be more than 500 characters.
    // Cannot be "".
    optional string name = 3;
  }

  // The entity path.
  // An entity path consists of one or more elements composed of a kind and a
  // string or numerical identifier, which identify entities. The first
  // element identifies a <em>root entity</em>, the second element identifies
  // a <em>child</em> of the root entity, the third element a child of the
  // second entity, and so forth. The entities identified by all prefixes of
  // the path are called the element's <em>ancestors</em>.
  // An entity path is always fully complete: ALL of the entity's ancestors
  // are required to be in the path along with the entity identifier itself.
  // The only exception is that in some documented cases, the identifier in the
  // last path element (for the entity) itself may be omitted. A path can never
  // be empty.
  repeated PathElement path_element = 2;
}

// A message that can hold any of the supported value types and associated
// metadata.
//
// At most one of the <type>Value fields may be set.
// If none are set the value is "null".
//
message Value {
  // A boolean value.
  optional bool boolean_value = 1;
  // An integer value.
  optional int64 integer_value = 2;
  // A double value.
  optional double double_value = 3;
  // A timestamp value.
  optional int64 timestamp_microseconds_value = 4;
  // A key value.
  optional Key key_value  = 5;
  // A blob key value.
  optional string blob_key_value = 16;
  // A UTF-8 encoded string value.
  optional string string_value = 17;
  // A blob value.
  optional bytes blob_value = 18;
  // An entity value.
  // May have no key.
  // May have a key with an incomplete key path.
  // May have a reserved/read-only key.
  optional Entity entity_value = 6;
  // A list value.
  // Cannot contain another list value.
  // Cannot also have a meaning and indexing set.
  repeated Value list_value = 7;

  // The <code>meaning</code> field is reserved and should not be used.
  optional int32 meaning = 14;

  // If the value should be indexed.
  //
  // The <code>indexed</code> property may be set for a
  // <code>null</code> value.
  // When <code>indexed</code> is <code>true</code>, <code>stringValue</code>
  // is limited to 500 characters and the blob value is limited to 500 bytes.
  // Exception: If meaning is set to 2, string_value is limited to 2038
  // characters regardless of indexed.
  // When indexed is true, meaning 15 and 22 are not allowed, and meaning 16
  // will be ignored on input (and will never be set on output).
  // Input values by default have <code>indexed</code> set to
  // <code>true</code>; however, you can explicitly set <code>indexed</code> to
  // <code>true</code> if you want. (An output value never has
  // <code>indexed</code> explicitly set to <code>true</code>.) If a value is
  // itself an entity, it cannot have <code>indexed</code> set to
  // <code>true</code>.
  // Exception: An entity value with meaning 9, 20 or 21 may be indexed.
  optional bool indexed = 15 [default = true];
}

// An entity property.
message Property {
  // The name of the property.
  // A property name matching regex "__.*__" is reserved.
  // A reserved property name is forbidden in certain documented contexts.
  // The name must not contain more than 500 characters.
  // Cannot be "".
  required string name = 1;

  // The value(s) of the property.
  // Each value can have only one value property populated. For example,
  // you cannot have a values list of <code>{ value: { integerValue: 22,
  // stringValue: "a" } }</code>, but you can have <code>{ value: { listValue:
  // [ { integerValue: 22 }, { stringValue: "a" } ] }</code>.
  required Value value = 4;
}

// An entity.
//
// An entity is limited to 1 megabyte when stored. That <em>roughly</em>
// corresponds to a limit of 1 megabyte for the serialized form of this
// message.
message Entity {
  // The entity's key.
  //
  // An entity must have a key, unless otherwise documented (for example,
  // an entity in <code>Value.entityValue</code> may have no key).
  // An entity's kind is its key's path's last element's kind,
  // or null if it has no key.
  optional Key key = 1;
  // The entity's properties.
  // Each property's name must be unique for its entity.
  repeated Property property = 2;
}

// The result of fetching an entity from the datastore.
message EntityResult {
  // Specifies what data the 'entity' field contains.
  // A ResultType is either implied (for example, in LookupResponse.found it
  // is always FULL) or specified by context (for example, in message
  // QueryResultBatch, field 'entity_result_type' specifies a ResultType
  // for all the values in field 'entity_result').
  enum ResultType {
    FULL = 1;  // The entire entity.
    PROJECTION = 2;  // A projected subset of properties.
                     // The entity may have no key.
                     // A property value may have meaning 18.
    KEY_ONLY = 3;  // Only the key.
  }

  // The resulting entity.
  required Entity entity = 1;
}

// A query.
message Query {
  // The projection to return. If not set the entire entity is returned.
  repeated PropertyExpression projection = 2;

  // The kinds to query (if empty, returns entities from all kinds).
  repeated KindExpression kind = 3;

  // The filter to apply (optional).
  optional Filter filter = 4;

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

  // The properties to group by (if empty, no grouping is applied to the
  // result set).
  repeated PropertyReference group_by = 6;

  // A starting point for the query results. Optional. Query cursors are
  // returned in query result batches.
  optional bytes /* serialized QueryCursor */ start_cursor = 7;

  // An ending point for the query results. Optional. Query cursors are
  // returned in query result batches.
  optional bytes /* serialized QueryCursor */ end_cursor = 8;

  // The number of results to skip. Applies before limit, but after all other
  // constraints (optional, defaults to 0).
  optional int32 offset = 10 [default=0];

  // The maximum number of results to return. Applies after all other
  // constraints. Optional.
  optional int32 limit = 11;
}

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

// A reference to a property relative to the kind expressions.
// exactly.
message PropertyReference {
  // The name of the property.
  required string name = 2;
}

// A representation of a property in a projection.
message PropertyExpression {
  enum AggregationFunction {
    FIRST = 1;
  }
  // The property to project.
  required PropertyReference property = 1;
  // The aggregation function to apply to the property. Optional.
  // Can only be used when grouping by at least one property. Must
  // then be set on all properties in the projection that are not
  // being grouped by.
  optional AggregationFunction aggregation_function = 2;
}

// The desired order for a specific property.
message PropertyOrder {
  enum Direction {
    ASCENDING = 1;
    DESCENDING = 2;
  }
  // The property to order by.
  required PropertyReference property = 1;
  // The direction to order by.
  optional Direction direction = 2 [default=ASCENDING];
}

// A holder for any type of filter. Exactly one field should be specified.
message Filter {
  // A composite filter.
  optional CompositeFilter composite_filter = 1;
  // A filter on a property.
  optional PropertyFilter property_filter = 2;
}

// A filter that merges the multiple other filters using the given operation.
message CompositeFilter {
  enum Operator {
    AND = 1;
  }

  // The operator for combining multiple filters.
  required Operator operator = 1;
  // The list of filters to combine.
  // Must contain at least one filter.
  repeated Filter filter = 2;
}

// A filter on a specific property.
message PropertyFilter {
  enum Operator {
    LESS_THAN = 1;
    LESS_THAN_OR_EQUAL = 2;
    GREATER_THAN = 3;
    GREATER_THAN_OR_EQUAL = 4;
    EQUAL = 5;

    HAS_ANCESTOR = 11;
  }

  // The property to filter by.
  required PropertyReference property = 1;
  // The operator to filter by.
  required Operator operator = 2;
  // The value to compare the property to.
  required Value value = 3;
}

// A GQL query.
message GqlQuery {
  required string query_string = 1;
  // When false, the query string must not contain a literal.
  optional bool allow_literal = 2 [default = false];
  // A named argument must set field GqlQueryArg.name.
  // No two named arguments may have the same name.
  // For each non-reserved named binding site in the query string,
  // there must be a named argument with that name,
  // but not necessarily the inverse.
  repeated GqlQueryArg name_arg = 3;
  // Numbered binding site @1 references the first numbered argument,
  // effectively using 1-based indexing, rather than the usual 0.
  // A numbered argument must NOT set field GqlQueryArg.name.
  // For each binding site numbered i in query_string,
  // there must be an ith numbered argument.
  // The inverse must also be true.
  repeated GqlQueryArg number_arg = 4;
}

// A binding argument for a GQL query.
// Exactly one of fields value and cursor must be set.
message GqlQueryArg {
  // Must match regex "[A-Za-z_$][A-Za-z_$0-9]*".
  // Must not match regex "__.*__".
  // Must not be "".
  optional string name = 1;
  optional Value value = 2;
  optional bytes cursor = 3;
}

// A batch of results produced by a query.
message QueryResultBatch {
  // The possible values for the 'more_results' field.
  enum MoreResultsType {
    NOT_FINISHED = 1;  // There are additional batches to fetch from this query.
    MORE_RESULTS_AFTER_LIMIT = 2;  // The query is finished, but there are more
                                   // results after the limit.
    NO_MORE_RESULTS = 3;  // The query has been exhausted.
  }

  // The result type for every entity in entityResults.
  required EntityResult.ResultType entity_result_type = 1;
  // The results for this batch.
  repeated EntityResult entity_result = 2;

  // A cursor that points to the position after the last result in the batch.
  // May be absent.
  optional bytes /* serialized QueryCursor */ end_cursor = 4;

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

  // The number of results skipped because of <code>Query.offset</code>.
  optional int32 skipped_results = 6;
}

// A set of changes to apply.
//
// No entity in this message may have a reserved property name,
// not even a property in an entity in a value.
// No value in this message may have meaning 18,
// not even a value in an entity in another value.
//
// If entities with duplicate keys are present, an arbitrary choice will
// be made as to which is written.
message Mutation {
  // Entities to upsert.
  // Each upserted entity's key must have a complete path and
  // must not be reserved/read-only.
  repeated Entity upsert = 1;
  // Entities to update.
  // Each updated entity's key must have a complete path and
  // must not be reserved/read-only.
  repeated Entity update = 2;
  // Entities to insert.
  // Each inserted entity's key must have a complete path and
  // must not be reserved/read-only.
  repeated Entity insert = 3;
  // Insert entities with a newly allocated ID.
  // Each inserted entity's key must omit the final identifier in its path and
  // must not be reserved/read-only.
  repeated Entity insert_auto_id = 4;
  // Keys of entities to delete.
  // Each key must have a complete key path and must not be reserved/read-only.
  repeated Key delete = 5;
  // Ignore a user specified read-only period. Optional.
  optional bool force = 6;
}

// The result of applying a mutation.
message MutationResult {
  // Number of index writes.
  required int32 index_updates = 1;
  // Keys for <code>insertAutoId</code> entities. One per entity from the
  // request, in the same order.
  repeated Key insert_auto_id_key = 2;
}

// Options shared by read requests.
message ReadOptions {
  enum ReadConsistency {
    DEFAULT = 0;
    STRONG = 1;
    EVENTUAL = 2;
  }

  // The read consistency to use.
  // Cannot be set when transaction is set.
  // Lookup and ancestor queries default to STRONG, global queries default to
  // EVENTUAL and cannot be set to STRONG.
  optional ReadConsistency read_consistency = 1 [default=DEFAULT];

  // The transaction to use. Optional.
  optional bytes /* serialized Transaction */ transaction = 2;
}

// The request for Lookup.
message LookupRequest {

  // Options for this lookup request. Optional.
  optional ReadOptions read_options = 1;
  // Keys of entities to look up from the datastore.
  repeated Key key = 3;
}

// The response for Lookup.
message LookupResponse {

  // The order of results in these fields is undefined and has no relation to
  // the order of the keys in the input.

  // Entities found as ResultType.FULL entities.
  repeated EntityResult found = 1;

  // Entities not found as ResultType.KEY_ONLY entities.
  repeated EntityResult missing = 2;

  // A list of keys that were not looked up due to resource constraints.
  repeated Key deferred = 3;
}


// The request for RunQuery.
message RunQueryRequest {

  // The options for this query.
  optional ReadOptions read_options = 1;

  // Entities are partitioned into subsets, identified by a dataset (usually
  // implicitly specified by the project) and namespace ID. Queries are scoped
  // to a single partition.
  // This partition ID is normalized with the standard default context
  // partition ID, but all other partition IDs in RunQueryRequest are
  // normalized with this partition ID as the context partition ID.
  optional PartitionId partition_id = 2;

  // The query to run.
  // Either this field or field gql_query must be set, but not both.
  optional Query query = 3;
  // The GQL query to run.
  // Either this field or field query must be set, but not both.
  optional GqlQuery gql_query = 7;
}

// The response for RunQuery.
message RunQueryResponse {

  // A batch of query results (always present).
  optional QueryResultBatch batch = 1;

}

// The request for BeginTransaction.
message BeginTransactionRequest {

  enum IsolationLevel {
    SNAPSHOT = 0;  // Read from a consistent snapshot. Concurrent transactions
                   // conflict if their mutations conflict. For example:
                   // Read(A),Write(B) may not conflict with Read(B),Write(A),
                   // but Read(B),Write(B) does conflict with Read(B),Write(B).
    SERIALIZABLE = 1; // Read from a consistent snapshot. Concurrent
                      // transactions conflict if they cannot be serialized.
                      // For example Read(A),Write(B) does conflict with
                      // Read(B),Write(A) but Read(A) may not conflict with
                      // Write(A).
  }

  // The transaction isolation level.
  optional IsolationLevel isolation_level = 1 [default=SNAPSHOT];
}

// The response for BeginTransaction.
message BeginTransactionResponse {

  // The transaction identifier (always present).
  optional bytes /* serialized Transaction */ transaction = 1;
}

// The request for Rollback.
message RollbackRequest {

  // The transaction identifier, returned by a call to
  // <code>beginTransaction</code>.
  required bytes /* serialized Transaction */ transaction = 1;
}

// The response for Rollback.
message RollbackResponse {
// Empty
}

// The request for Commit.
message CommitRequest {

  enum Mode {
    TRANSACTIONAL = 1;
    NON_TRANSACTIONAL = 2;
  }

  // The transaction identifier, returned by a call to
  // <code>beginTransaction</code>. Must be set when mode is TRANSACTIONAL.
  optional bytes /* serialized Transaction */ transaction = 1;
  // The mutation to perform. Optional.
  optional Mutation mutation = 2;
  // The type of commit to perform. Either TRANSACTIONAL or NON_TRANSACTIONAL.
  optional Mode mode = 5 [default=TRANSACTIONAL];
}

// The response for Commit.
message CommitResponse {

  // The result of performing the mutation (if any).
  optional MutationResult mutation_result = 1;
}

// The request for AllocateIds.
message AllocateIdsRequest {

  // A list of keys with incomplete key paths to allocate IDs for.
  // No key may be reserved/read-only.
  repeated Key key = 1;
}

// The response for AllocateIds.
message AllocateIdsResponse {

  // The keys specified in the request (in the same order), each with
  // its key path completed with a newly allocated ID.
  repeated Key key = 1;
}

// Each rpc normalizes the partition IDs of the keys in its input entities,
// and always returns entities with keys with normalized partition IDs.
// (Note that applies to all entities, including entities in values.)
service DatastoreService {
  // Look up some entities by key.
  rpc Lookup(LookupRequest) returns (LookupResponse) {
  };
  // Query for entities.
  rpc RunQuery(RunQueryRequest) returns (RunQueryResponse) {
  };
  // Begin a new transaction.
  rpc BeginTransaction(BeginTransactionRequest) returns (BeginTransactionResponse) {
  };
  // Commit a transaction, optionally creating, deleting or modifying some
  // entities.
  rpc Commit(CommitRequest) returns (CommitResponse) {
  };
  // Roll back a transaction.
  rpc Rollback(RollbackRequest) returns (RollbackResponse) {
  };
  // Allocate IDs for incomplete keys (useful for referencing an entity before
  // it is inserted).
  rpc AllocateIds(AllocateIdsRequest) returns (AllocateIdsResponse) {
  };
}
