syntax = "proto2";

package NRTYServer;

option java_package = "ru.yandex.search.saas";
option java_outer_classname = "RTYServer";

import "mapreduce/yt/interface/protos/extension.proto";
import "saas/protos/positions.proto";
import "yweb/protos/indexeddoc.proto";
import "kernel/search_zone/protos/searchzone.proto";

message TMessage {

    enum TMessageType {

        /*
            документ, указанный в TMessage::Document, будет добавлен в индекс
        */
        ADD_DOCUMENT = 0;

        /*
            документ, указанный в TMessage::Document, будет модифицирован в индексе
        */
        MODIFY_DOCUMENT = 1;

        /*
            документ, Url которого указан в TMessage::Document, будет удален из индекса
        */
        DELETE_DOCUMENT = 2;

        /*
            Для документа, Url которого указан в TMessage::Document, будут обновлены группировочные аттрибуты
            This type of message is being deprecated. See https://st.yandex-team.ru/SAAS-6095
        */
        DEPRECATED__UPDATE_DOCUMENT = 3;

        /*
            Команда переоткрытия индексов. Не требует дополнительных аргументов.
        */
        REOPEN_INDEXERS = 4;

        /*
            Команда переключает keyprefix по умолчанию.
        */
        SWITCH_PREFIX = 11;
    }

    enum TUpdateType {
        UNDEFINED = 0;
        FAST = 1;
        SLOW = 2;
    }

    required TMessageType MessageType = 1;

    message TFactorValues {
        option (NYT.default_field_flags) = SERIALIZATION_YT;

        enum TAction {
            SET = 1;
            ADD = 2;
        }
        message TValue {
            optional TAction Action = 1 [default=SET];
            required float Value = 2;
        }

        repeated TValue Values = 1;
    }

    message TFactorsByKey {
        option (NYT.default_field_flags) = SERIALIZATION_YT;

        required string Key = 1;
        required TFactorValues Values = 2;
    }

    message TErfInfo {
        option (NYT.default_field_flags) = SERIALIZATION_YT;

        repeated string Names = 2;
        required TFactorValues Values = 3;
    }

    message TQSInfo {
        option (NYT.default_field_flags) = SERIALIZATION_YT;

        required string Name = 1;
        repeated string FactorNames = 2;
        repeated TFactorsByKey Factors = 3;
    }

    message TCSInfo {
        option (NYT.default_field_flags) = SERIALIZATION_YT;

        required string Name = 1;
        required TErfInfo Factors = 4;
    }

    message TStreamData {
        option (NYT.default_field_flags) = SERIALIZATION_YT;

        enum TAction {
            SET = 1;
            ADD = 2;
        }

        message TValue {
            optional TAction Action = 1 [default=SET];
            required string Value = 2;
        }

        required string Name = 1;
        required TValue Value = 2;
    }

    message TRegionData {
        option (NYT.default_field_flags) = SERIALIZATION_YT;

        optional uint32 Region = 1 [default = 0];
        repeated TStreamData Streams = 2;
    }

    message TSentenceData {
        option (NYT.default_field_flags) = SERIALIZATION_YT;

        required string Text = 1;
        optional uint32 TextLanguage = 2;
        repeated TRegionData StreamsByRegion = 3;
    }

    message TAnnData {
        option (NYT.default_field_flags) = SERIALIZATION_YT;

        repeated TSentenceData Sentences = 1;
    }

    message TGeoObject {
        option (NYT.default_field_flags) = SERIALIZATION_YT;

        optional string Type = 1;
        repeated float Data = 2;
    }

    message TGeoLayer {
        option (NYT.default_field_flags) = SERIALIZATION_YT;

        optional string Layer = 1; // Имя слоя
        repeated TGeoObject GeoDoc = 2; // Геообъект (не более 1 на слой)
    }

    message TGeoData {
        option (NYT.default_field_flags) = SERIALIZATION_YT;

        repeated TGeoLayer Layers = 1;
    }

    message TEmbedding {
        required string Name = 1;
        required bytes Value = 2;
        optional string Version = 3;
        optional string Tag = 4;
    }

    message TTimestamp {
        required uint32 Stream = 1;
        required uint64 Value = 2;
        optional uint64 ValueEx = 3;
    }

    message TDocument {
        option (NYT.default_field_flags) = SERIALIZATION_YT;
        option (NYT.message_flags) = DEPRECATED_SORT_FIELDS_AS_IN_PROTO_FILE;

        /*
            Url документа. Произвольный уникальный строковой идентификатор с семантикой Url.
            Используется для отождествления документов при выполнении команд MODIFY_DOCUMENTS и DELETE_DOCUMENTS.
            Внутренние сервисные процедуры индексатора также испольуют факт уникальности Url
        */
        required string Url = 1;

        /*
            Mime тип содержимого документа, находящегося в поле TMessage::TDocument::Body.
            Поддерживаются следующие типы:
            text/html
            text/rtf
            application/msword
            application/x-shockwave-flash
            application/vnd.ms-excel
            application/vnd.ms-powerpoint
            text/xml
            application/pdf
            text/plain
            audio/mpeg
            application/vnd.openxmlformats-officedocument.wordprocessingml.document
            application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
            application/vnd.openxmlformats-officedocument.presentationml.presentation
            application/vnd.oasis.opendocument.text
            application/vnd.oasis.opendocument.presentation
            application/vnd.oasis.opendocument.spreadsheet
            application/vnd.oasis.opendocument.graphics
        */
        optional string MimeType = 2;

        /*
            Кодировка содержимого документа, находящегося в поле TMessage::TDocument::Body
            Например,
            cp1251
            windows-1251
            utf-8
            koi8
            latin1
        */
        optional string Charset = 3;

        /*
            Язык содержимого документа, находящегося в поле TMessage::TDocument::Body
            Например,
            ru
            rus
            en
            eng
            Если язык или кодировка не определены, а RecognizeLibraryFile
            присутствует, то кодировка и язык документа будут определены
            автоматически. Рекомендуется их проставлять, дабы сэкономить
            время на распознавании.
        */
        optional string Language = 11;

        /*
            Вторичный язык документа.
        */
        optional string Language2 = 12;

        /*
            Язык документа, на случай, если Language не указан, а распознать язык автоматически не удалось.
        */
        optional string LanguageDefault = 14;

        optional uint32 StreamId = 28;
        optional uint32 ModificationTimestamp = 5;

        optional string Body = 6;

        /*
            Общий префикс всех ключей в индексе, созданных для этого документа.
            Используется для оптимизации скорости поиска по личным документам.
            В случае использования, KeyPrefix должен быть приравнен пользовательскому идентификатору.
            Во время поиска по префиксному индексу следует добавлять оператор keyprefix.
            Например:
            Пластиковые окна keyprefix:12345
        */
        optional int64 KeyPrefix = 10;

        repeated TAttribute SearchAttributes = 7;
        repeated TAttribute GroupAttributes = 8;

        message TProperty {
            required string Name = 1;
            required string Value = 2;
            optional uint32 Timestamp = 3;
        }

        repeated TProperty DocumentProperties = 9;
        optional TZone RootZone = 15 [(NYT.flags) = SERIALIZATION_PROTOBUF];

        optional NRealTime.TIndexedDoc IndexedDoc = 18 [(NYT.flags) = SERIALIZATION_PROTOBUF];

        optional int64 DeadlineMinutesUTC = 19;
        optional uint64 Version = 22;
        optional bool Realtime = 23;
        optional bool CheckOnlyBeforeReply = 24;

        repeated TQSInfo QSInfo = 25;
        repeated TCSInfo CSInfo = 26;
        optional TErfInfo Factors = 27;
        repeated TProperty FSProperties = 30;
        optional TUpdateType UpdateType = 31 [default=UNDEFINED];
        optional TAnnData AnnData = 32;
        optional TGeoData GeoData = 42;
        repeated TEmbedding Embeddings = 43; 
        repeated TTimestamp Timestamps = 33;
        optional uint32 DatabaseVersion = 34 [default = 0];
        repeated TProperty AdditionalKeys = 35;
        optional double FilterRank = 36 [default = 100000];
        optional TPosition Position = 37;
        repeated TPosition ExtraPositions = 38;
        optional uint32 VersionTimestamp = 39;
        repeated TProperty TrigramIndexedProps = 40;

        // Was repeated TProperty L2IndexData = 41
        reserved "L2IndexData";
        reserved 41;
    }

    optional TDocument Document = 2;

    /*
        Идентификатор сообщения в текущей сессии.
        Используется для сопоставления отправленных документов и результатов их
        отсылки. Если MessageId установлен, то в ответ придёт TReply описанный
        в reply.proto. Полезно, если вы хотите дождаться, когда закончится процесс
        инициированный отправкой REOPEN_INDEXERS напрямую в rtyserver.
    */
    optional uint64 MessageId = 5;
    optional uint64 ExternalShard = 6;
    optional uint64 IndexSleepMs = 7;
    repeated string DistributorAttributes = 8;

    optional uint64 ReceiveTimestamp = 9;

    message TLogProperties {
        required string Name = 1;
        required string Value = 2;
    }
    repeated TLogProperties LoggingProperties = 10;

    // For rthub
    optional uint64 RthubOutputShardId = 11;
    optional bytes Error = 12;
}

message TParsedDoc {
    optional string ParserConfig = 1;
    required TMessage.TDocument Document = 2;
    optional bool IsUpdate = 4 [default = true];

    // Was optional bool StoredForUpdate = 3 [default = false];
    reserved "StoredForUpdate";
    reserved 3;
}

