// Copyright (c) 2011 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// InMemoryURLIndex caching protocol buffers.
//
// At certain times during browser operation, the indexes from the
// InMemoryURLIndex are written to a disk-based cache using the
// following protobuf description.

syntax = "proto2";

option optimize_for = LITE_RUNTIME;

package in_memory_url_index;

message InMemoryURLIndexCacheItem {

  message WordListItem {
    required uint32 word_count = 1;
    repeated string word = 2;
  }

  message WordMapItem {
    message WordMapEntry {
      required string word = 1;
      required int32 word_id = 2;
    }

    required uint32 item_count = 1;
    repeated WordMapEntry word_map_entry = 2;
  }

  message CharWordMapItem {
    message CharWordMapEntry {
      required uint32 item_count = 1;
      required int32 char_16 = 2;
      repeated int32 word_id = 3 [packed=true];
    }

    required uint32 item_count = 1;
    repeated CharWordMapEntry char_word_map_entry = 2;
  }

  message WordIDHistoryMapItem {
    message WordIDHistoryMapEntry {
      required uint32 item_count = 1;
      required int32 word_id = 2;
      repeated int64 history_id = 3 [packed=true];
    }

    required uint32 item_count = 1;
    repeated WordIDHistoryMapEntry word_id_history_map_entry = 2;
  }

  message HistoryInfoMapItem {
    message HistoryInfoMapEntry {
      message VisitInfo {
        required int64 visit_time = 1;
        // Corresponds to content::PageTransition.
        required uint64 transition_type = 2;
      }
      required int64 history_id = 1;
      required int32 visit_count = 2;
      required int32 typed_count = 3;
      required int64 last_visit = 4;
      required string url = 5;
      optional string title = 6;
      repeated VisitInfo visits = 7;
    }

    required uint32 item_count = 1;
    repeated HistoryInfoMapEntry history_info_map_entry = 2;
  }

  message WordStartsMapItem {
    message WordStartsMapEntry {
      required int64 history_id = 1;
      repeated int32 url_word_starts = 2 [packed=true];
      repeated int32 title_word_starts = 3 [packed=true];
    }

    required uint32 item_count = 1;
    repeated WordStartsMapEntry word_starts_map_entry = 2;
  }

  // The date that the cache was last rebuilt from history.  Note that
  // this cache may include items that were visited after this date if
  // the InMemoryURLIndex was updated on the fly.  This timestamp is meant
  // to indicate the last date the index was rebuilt from the ground truth:
  // the history database on disk.
  required int64 last_rebuild_timestamp = 1;
  // If there is no version we'll assume version 0.
  optional int32 version = 2;
  required int32 history_item_count = 3;

  optional WordListItem word_list = 4;
  optional WordMapItem word_map = 5;
  optional CharWordMapItem char_word_map = 6;
  optional WordIDHistoryMapItem word_id_history_map = 7;
  optional HistoryInfoMapItem history_info_map = 8;
  optional WordStartsMapItem word_starts_map = 9;
}
