/*
 * Copyright (C) 2017 Dgraph Labs, Inc. and Contributors
 *
 * 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.
 */

// Style guide for Protocol Buffer 3.
// Use CamelCase (with an initial capital) for message names – for example,
// SongServerRequest. Use underscore_separated_names for field names – for
// example, song_name.

syntax = "proto3";

package api;

/* import "gogoproto/gogo.proto"; */

/* option (gogoproto.marshaler_all) = true; */
/* option (gogoproto.sizer_all) = true; */
/* option (gogoproto.unmarshaler_all) = true; */
/* option (gogoproto.goproto_getters_all) = true; */

option java_package = "io.dgraph";
option java_outer_classname = "DgraphProto";

// Graph response.
service Dgraph {
    rpc Login (LoginRequest)       returns (Response) {}
    rpc Query (Request)            returns (Response) {}
    rpc Mutate (Mutation)          returns (Assigned) {}
    rpc Alter (Operation)          returns (Payload) {}
    rpc CommitOrAbort (TxnContext) returns (TxnContext) {}
    rpc CheckVersion(Check)        returns (Version) {}
}

message Request {
    string query = 1;
    map<string, string> vars = 2; // Support for GraphQL like variables.

    uint64 start_ts = 13;
    LinRead lin_read = 14;
    bool read_only = 15;
    bool best_effort = 16;
}

message Response {
    bytes json = 1;
    repeated SchemaNode schema = 2 [deprecated=true];
    TxnContext txn = 3;
    Latency latency = 12;
}

message Assigned {
    map<string, string> uids = 1;
    TxnContext context = 2;
    Latency latency = 12;
}

message Mutation {
    bytes set_json = 1;
    bytes delete_json = 2;
    bytes set_nquads = 3;
    bytes del_nquads = 4;
    string query = 5;
    string cond = 6;

    repeated NQuad set = 10;
    repeated NQuad del = 11;
    uint64 start_ts = 13;
    bool commit_now = 14;
    bool ignore_index_conflict = 15; // this field is not parsed and used by the server anymore.
}

message Operation {
    string schema = 1;
    string drop_attr = 2;
    bool drop_all = 3;

    enum DropOp {
        NONE = 0;
        ALL = 1;
        DATA = 2;
        ATTR = 3;
        TYPE = 4;
    }
    DropOp drop_op = 4;

    // If drop_op is ATTR or TYPE, drop_value holds the name of the predicate or
    // type to delete.
    string drop_value = 5;
}

// Worker services.
message Payload {
    bytes Data = 1;
}

message TxnContext {
    uint64 start_ts = 1;
    uint64 commit_ts = 2;
    bool aborted = 3;
    repeated string keys = 4;  // List of keys to be used for conflict detection.
    repeated string preds = 5; // List of predicates involved in this transaction.
    LinRead lin_read = 13;
}

message Check {}

message Version {
    string tag = 1;
}

message LinRead {
    enum Sequencing {
        CLIENT_SIDE = 0;
        SERVER_SIDE = 1;
    }

    map<uint32, uint64> ids = 1;
    Sequencing sequencing = 2;
}

message Latency {
    uint64 parsing_ns = 1;
    uint64 processing_ns = 2;
    uint64 encoding_ns = 3;
    uint64 assign_timestamp_ns = 4;
}

message NQuad {
    string subject = 1;
    string predicate = 2;
    string object_id = 3;
    Value object_value = 4;
    string label = 5;
    string lang = 6;
    repeated Facet facets = 7;
}

message Value {
    oneof val {
        string default_val = 1;
        bytes bytes_val = 2;
        int64 int_val = 3;
        bool bool_val = 4;
        string str_val = 5;
        double double_val = 6;
        bytes geo_val = 7;  // Geo data in WKB format
        bytes date_val = 8;
        bytes datetime_val = 9;
        string password_val = 10;
        uint64 uid_val=11;
    }
}

message Facet {
    enum ValType {
        STRING = 0;
        INT = 1;
        FLOAT = 2;
        BOOL = 3;
        DATETIME = 4;
    }

    string key = 1;
    bytes value = 2;
    ValType val_type = 3;
    repeated string tokens = 4; // tokens of value.
    string alias = 5; // not stored, only used for query.
}

message SchemaNode {
    string predicate = 1;
    string type = 2;
    bool index = 3;
    repeated string tokenizer = 4;
    bool reverse = 5;
    bool count = 6;
    bool list = 7;
    bool upsert = 8;
    bool lang = 9;
}

message LoginRequest {
    string userid = 1;
    string password = 2;
    string refresh_token = 3;
}

message Jwt {
    string access_jwt = 1;
    string refresh_jwt = 2;
}

// vim: noexpandtab sw=2 ts=2
