class RayyanStore::Client

Constants

CONNECT_TIMEOUT
READ_TIMEOUT

Public Class Methods

new() click to toggle source
# File lib/rayyan-store.rb, line 12
def initialize
  raise 'RAYYAN_STORE_URL environment variable not found' unless ENV['RAYYAN_STORE_URL']
  @url = ENV['RAYYAN_STORE_URL']
  # Excon.stub({}, {:body => 'OK', :status => 200})
end

Public Instance Methods

add_note(review_id, article_id, user_id, note_id, note_text) click to toggle source
# File lib/rayyan-store.rb, line 209
def add_note(review_id, article_id, user_id, note_id, note_text)
  post_request "/reviews/#{review_id}/articles/#{article_id}/users/#{user_id}/notes/#{note_id}",{
    note_text: note_text
  }
end
batch_insert_suggestion_rating(review_id, inserts_list) click to toggle source
# File lib/rayyan-store.rb, line 181
def batch_insert_suggestion_rating(review_id, inserts_list)
  # inserts_list is an array of dicts of the form:
  #                     {article_id: <article_id>,
  #                      score: <rating_score_float>,
  #                      star: <star_cutoff_uint>}
  post_request '/batch-insert-suggestion-rating', {
    review_id: review_id,
    inserts_list: inserts_list
  }
end
batch_update_customization(review_id, updates_list, log_enabled = true) click to toggle source
# File lib/rayyan-store.rb, line 133
def batch_update_customization(review_id, updates_list, log_enabled = true)
  post_request '/batch-update-customization', {
    review_id: review_id,
    updates_list: updates_list,
    log_enabled: log_enabled
  }
end
batch_update_dedup_user_action(review_id, updates_list) click to toggle source
# File lib/rayyan-store.rb, line 165
def batch_update_dedup_user_action(review_id, updates_list)
  post_request '/batch-update-dedup', {
    review_id: review_id,
    updates_list: updates_list
  }
end
create_review(review_id, version = nil) click to toggle source
# File lib/rayyan-store.rb, line 18
def create_review(review_id, version = nil)
  post_request("/reviews/#{review_id}", {version: version})
end
customizations_count(review_ids, start_date, end_date) click to toggle source
# File lib/rayyan-store.rb, line 234
def customizations_count(review_ids, start_date, end_date)
  get_request '/customizations-count', {
    start_date: start_date,
    end_date: end_date
  }, {
    review_ids: review_ids
  }
end
delete_by_file_id(review_id, file_id) click to toggle source
# File lib/rayyan-store.rb, line 44
def delete_by_file_id(review_id, file_id)
  delete_request "/delete-by-file-id/#{file_id}", {
    review_id: review_id
  }
end
delete_customization(review_id, article_id, user_id, key, log_enabled = true) click to toggle source
# File lib/rayyan-store.rb, line 123
def delete_customization(review_id, article_id, user_id, key, log_enabled = true)
  delete_request '/customization', {
    review_id: review_id,
    article_id: article_id,
    user_id: user_id,
    key: key,
    log_enabled: log_enabled
  }
end
delete_fulltext(review_id, article_id, fulltext_id, is_public) click to toggle source
# File lib/rayyan-store.rb, line 200
def delete_fulltext(review_id, article_id, fulltext_id, is_public)
  delete_request '/delete-fulltext', {
    review_id: review_id,
    article_id: article_id,
    fulltext_id: fulltext_id,
    is_public: is_public
  }
end
delete_highlight(review_id, category, keyword, user_id) click to toggle source
# File lib/rayyan-store.rb, line 268
def delete_highlight(review_id, category, keyword, user_id)
  delete_request(
    "/reviews/#{review_id}/highlights/category/#{category}",
    nil,
    { user_id: user_id, keyword: keyword }
  )
end
delete_note(review_id, article_id, user_id, note_id) click to toggle source
# File lib/rayyan-store.rb, line 221
def delete_note(review_id, article_id, user_id, note_id)
  delete_request "/reviews/#{review_id}/articles/#{article_id}/users/#{user_id}/notes/#{note_id}"
end
delete_review(review_id) click to toggle source
# File lib/rayyan-store.rb, line 22
def delete_review(review_id)
  delete_request "/reviews/#{review_id}"
end
edit_note(review_id, article_id, user_id, note_id, note_text) click to toggle source
# File lib/rayyan-store.rb, line 215
def edit_note(review_id, article_id, user_id, note_id, note_text)
  patch_request "/reviews/#{review_id}/articles/#{article_id}/users/#{user_id}/notes/#{note_id}",{
    note_text: note_text
  }
end
export(review_id, source, last_id, length) { |result| ... } click to toggle source
# File lib/rayyan-store.rb, line 50
def export(review_id, source, last_id, length)
  response = get_request('/export', {
    review_id: review_id,
    source: source,
    last_id: last_id,
    length: length
  })
  response['objects'].each do |result|
    yield result
  end
  response['last_id']
end
facet(review_id, key, user_ids, limit = 10) click to toggle source
# File lib/rayyan-store.rb, line 104
def facet(review_id, key, user_ids, limit = 10)
  get_request("/facet/#{key}", {
    review_id: review_id,
    user_ids: user_ids ? user_ids.join(',') : nil,
    limit: limit
  })
end
get_highlights(review_id, category) click to toggle source
# File lib/rayyan-store.rb, line 264
def get_highlights(review_id, category)
  get_request("/reviews/#{review_id}/highlights/category/#{category}")
end
import(review_id, articles, target = 'articles', version = nil) click to toggle source
# File lib/rayyan-store.rb, line 35
def import(review_id, articles, target = 'articles', version = nil)
  post_request('/import', {
    review_id: review_id,
    articles: articles.map{|a| a.select{|k, v| v && v != ''}},
    target: target,
    version: version
  })["article_ids"]
end
insert_customization(review_id, article_id, user_id, key, value = 1, log_enabled = true) click to toggle source
# File lib/rayyan-store.rb, line 112
def insert_customization(review_id, article_id, user_id, key, value = 1, log_enabled = true)
  post_request '/customization', {
    review_id: review_id,
    article_id: article_id,
    user_id: user_id,
    key: key,
    value: value,
    log_enabled: log_enabled
  }
end
insert_dedup_results(review_id, dedup_results, nullify = true) click to toggle source
# File lib/rayyan-store.rb, line 149
def insert_dedup_results(review_id, dedup_results, nullify = true)
  post_request '/insert-dedup', {
    review_id: review_id,
    dedup_results: dedup_results,
    nullify: nullify
  }
end
insert_fulltext(review_id, article_id, fulltext_obj) click to toggle source
# File lib/rayyan-store.rb, line 192
def insert_fulltext(review_id, article_id, fulltext_obj)
  post_request '/insert-fulltext', {
    review_id: review_id,
    article_id: article_id,
    fulltext_obj: fulltext_obj
  }
end
insert_highlights(review_id, category, highlights, user_id = nil) click to toggle source
# File lib/rayyan-store.rb, line 253
def insert_highlights(review_id, category, highlights, user_id = nil)
  query_params = {}
  query_params[:user_id] = user_id if user_id

  post_request(
    "/reviews/#{review_id}/highlights/category/#{category}",
    { highlights: highlights },
    query_params
  )
end
insert_suggestion_rating(review_id, article_id, score, stars) click to toggle source
# File lib/rayyan-store.rb, line 172
def insert_suggestion_rating(review_id, article_id, score, stars)
  post_request '/insert-suggestion-rating', {
    review_id: review_id,
    article_id: article_id,
    score: score,
    stars: stars
  }
end
last_customization(review_id, user_id, key) click to toggle source
# File lib/rayyan-store.rb, line 141
def last_customization(review_id, user_id, key)
  get_request 'last-customization', {
    review_id: review_id,
    user_id: user_id,
    key: key
  }
end
query(review_id, filter = {}, start_index = 0, length = 30, return_total = false, sort_key = 'id', sort_dir = 'asc') { |article| ... } click to toggle source
# File lib/rayyan-store.rb, line 80
def query(review_id, filter = {}, start_index = 0, length = 30,
  return_total = false, sort_key = 'id', sort_dir = 'asc')
  response = get_request('/query', {
    review_id: review_id,
    start_index: start_index,
    length: length,
    return_total: if return_total then 1 else 0 end,
    sort_key: sort_key,
    sort_dir: sort_dir
  }, {
    filter: filter
  })
  response["articles"].each {|article|
    yield article if block_given?
  }
  response["total"]
end
review_version(review_id) click to toggle source

Returns the version of a review. @param review_id [Int] The id of the review. @return [Int|nil] The version of the review if it exists or nil.

# File lib/rayyan-store.rb, line 29
def review_version(review_id)
  version = get_request "/reviews/#{review_id}/version"
  version = version.to_i if version.is_a? String
  version
end
stream_export(review_id, source, filter = {}) { |object| ... } click to toggle source
# File lib/rayyan-store.rb, line 63
def stream_export(review_id, source, filter = {})
  parser = Yajl::Parser.new(:symbolize_keys => true)
  parser.on_parse_complete = lambda do |object|
    # server is returning multiple json objects corresponding to results
    yield object
  end
  streamer = lambda do |chunk, remaining_bytes, total_bytes|
    parser << chunk
  end
  chunked_get_request('/stream-export', {
    review_id: review_id,
    source: source
  }, streamer, {
    filter: filter
  })
end
time_spent(review_id, user_id, threshold, preamble) click to toggle source
# File lib/rayyan-store.rb, line 225
def time_spent(review_id, user_id, threshold, preamble)
  get_request '/time-spent', {
    review_id: review_id,
    user_id: user_id,
    threshold: threshold,
    preamble: preamble
  }
end
topk_users_labels(review_ids, start_date, end_date, topk_limit) click to toggle source
# File lib/rayyan-store.rb, line 243
def topk_users_labels(review_ids, start_date, end_date, topk_limit)
  get_request '/topk-users-labels', {
    start_date: start_date,
    end_date: end_date,
    topk_limit: topk_limit
  }, {
    review_ids: review_ids
  }
end
total(review_id) click to toggle source
# File lib/rayyan-store.rb, line 98
def total(review_id)
  get_request('/total', {
    review_id: review_id
  })["total"]
end
update_dedup_user_action(review_id, article_id, user_action) click to toggle source
# File lib/rayyan-store.rb, line 157
def update_dedup_user_action(review_id, article_id, user_action)
  post_request '/update-dedup', {
    review_id: review_id,
    article_id: article_id,
    user_action: user_action
  }
end

Private Instance Methods

chunked_get_request(path, query, streamer_block, body = nil) click to toggle source
# File lib/rayyan-store.rb, line 322
def chunked_get_request(path, query, streamer_block, body = nil)
  request :get, path, query, body, streamer_block
end
connection() click to toggle source
# File lib/rayyan-store.rb, line 278
def connection
  # @connection ||= Excon.new(@url, persistent: false, mock: true)

  @connection ||= Excon.new(
    @url,
    persistent: false,
    connect_timeout: CONNECT_TIMEOUT,
    read_timeout: READ_TIMEOUT
  )
end
delete_request(path, body = nil, query = nil) click to toggle source
# File lib/rayyan-store.rb, line 338
def delete_request(path, body = nil, query = nil)
  request :delete, path, query, body
end
get_request(path, query = nil, body = nil) click to toggle source
# File lib/rayyan-store.rb, line 326
def get_request(path, query = nil, body = nil)
  request :get, path, query, body
end
patch_request(path, body = nil) click to toggle source
# File lib/rayyan-store.rb, line 334
def patch_request(path, body = nil)
  request :patch, path, nil, body
end
post_request(path, body = nil, query = nil) click to toggle source
# File lib/rayyan-store.rb, line 330
def post_request(path, body = nil, query = nil)
  request :post, path, query, body
end
request(method, path, query = nil, body = nil, streamer_block = nil) click to toggle source
# File lib/rayyan-store.rb, line 289
def request(method, path, query = nil, body = nil, streamer_block = nil)
  # Extract Review ID from request
  review_id = query && (query[:review_id] || query[:review_ids]) || \
              body && (body[:review_id] || body[:review_ids]) || \
              path.split('/')[2]

  # requests with multiple review_ids are not supported
  # by the proxy. Set X-Review-ID to nil so it fails in
  # the proxy. Remove this once proxy has support.
  review_id = nil if (query && query.key?(:review_ids)) || \
                     (body && body.key?(:review_ids))

  options = {
    path: path,
    query: query,
    body: body ? JSON.generate(body) : nil,
    headers: {
      "Content-Type" => "application/json",
      "X-Review-ID" => review_id
    }
  }
  if streamer_block
    options[:response_block] = streamer_block
  end
  response = connection.send(method, options)
  unless response.status == 200
    raise Exception.new "Error in #{method.upcase} #{path} [#{response.status}]: #{response.body}"
  end
  unless streamer_block
    JSON.parse(response.body) rescue response.body
  end
end