Class: Arx::Query

Inherits:
Object
  • Object
show all
Defined in:
lib/arx/query/query.rb

Overview

Class for generating arXiv search API query strings.

Constant Summary collapse

PARAMS =

Mapping for URL query parameters supported by the arXiv search API.

{
  search_query: 'search_query',
  id_list: 'id_list',
  sort_by: 'sortBy',
  sort_order: 'sortOrder'
}
CONNECTIVES =

Logical connectives supported by the arXiv search API.

{
  and: 'AND',
  or: 'OR',
  and_not: 'ANDNOT'
}
FIELDS =

Supported fields for the search queries made to the arXiv search API.

{
  title: 'ti',     # Title
  author: 'au',    # Author
  abstract: 'abs', # Abstract
  comment: 'co',   # Comment
  journal: 'jr',   # Journal reference
  category: 'cat', # Subject category
  report: 'rn',    # Report number
  all: 'all'       # All (of the above)
}
SORT_BY =

Supported criteria for the sortBy parameter.

{
  relevance: 'relevance',
  last_updated: 'lastUpdated',
  date_submitted: 'submittedDate'
}
SORT_ORDER =

Supported criteria for the sortOrder parameter.

{
  ascending: 'ascending',
  descending: 'descending'
}

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(*ids, sort_by: :relevance, sort_order: :descending) {|_self| ... } ⇒ Query

Initializes a new Query object.

Parameters:

  • ids (Array<String>)

    The IDs of the arXiv papers to restrict the query to.

  • sort_by (Symbol) (defaults to: :relevance)

    The sorting criteria for the returned results (see SORT_BY).

  • sort_order (Symbol) (defaults to: :descending)

    The sorting order for the returned results (see SORT_ORDER).

Yields:

  • (_self)

Yield Parameters:

  • _self (Arx::Query)

    the object that the method was called on



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/arx/query/query.rb', line 59

def initialize(*ids, sort_by: :relevance, sort_order: :descending)
  @query = String.new

  Validate.sort_by sort_by, permitted: SORT_BY.keys
  @query << "#{PARAMS[:sort_by]}=#{SORT_BY[sort_by]}"

  Validate.sort_order sort_order, permitted: SORT_ORDER.keys
  @query << "&#{PARAMS[:sort_order]}=#{SORT_ORDER[sort_order]}"

  ids.flatten!
  unless ids.empty?
    ids.map! {|id| Cleaner.extract_id(id, version: true)}
    @query << "&#{PARAMS[:id_list]}=#{ids * ','}"
  end

  yield self if block_given?
end

Instance Attribute Details

#queryString

The string representing the search query.

Returns:

  • (String)

    the current value of query



8
9
10
# File 'lib/arx/query/query.rb', line 8

def query
  @query
end

Instance Method Details

#abstract(*values, exact: true, connective: :and) ⇒ self

Search for papers by abstract.

Parameters:

  • values (Array<String>)

    Abstract(s) of papers to search for.

  • exact (Boolean) (defaults to: true)

    Whether to search for an exact match of the abstract(s).

  • connective (Symbol) (defaults to: :and)

    The logical connective to use (see CONNECTIVES). Only applies if there are multiple values.

Returns:

  • (self)


# File 'lib/arx/query/query.rb', line 115

#all(*values, exact: true, connective: :and) ⇒ self

Search for papers by all fields (see FIELDS).

Parameters:

  • values (Array<String>)

    Field value(s) of papers to search for.

  • exact (Boolean) (defaults to: true)

    Whether to search for an exact match of the comment(s).

  • connective (Symbol) (defaults to: :and)

    The logical connective to use (see CONNECTIVES). Only applies if there are multiple values.

Returns:

  • (self)


161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
# File 'lib/arx/query/query.rb', line 161

FIELDS.each do |name, field|
  define_method(name) do |*values, exact: true, connective: :and|
    return if values.empty?

    values.flatten!

    Validate.values values
    Validate.categories values if name == :category
    Validate.exact exact
    Validate.connective connective, permitted: CONNECTIVES.keys

    values.map! &CGI.method(:escape)

    # Forms a field:value pair
    pair = ->(value){"#{field}:#{exact ? enquote(value) : value}"}

    subquery = if values.size > 1
      parenthesize values.map(&pair).join("+#{CONNECTIVES[connective]}+")
    else
      pair.(values.first)
    end

    add_subquery subquery
    self
  end
end

#andself

Logical conjunction (AND) of subqueries.

Returns:

  • (self)

See Also:



# File 'lib/arx/query/query.rb', line 77

#and_notself

Logical negated conjunction (ANDNOT) of subqueries.

Returns:

  • (self)

See Also:



# File 'lib/arx/query/query.rb', line 83

#author(*values, exact: true, connective: :and) ⇒ self

Search for papers by author.

Parameters:

  • values (Array<String>)

    Author(s) of papers to search for.

  • exact (Boolean) (defaults to: true)

    Whether to search for an exact match of the author’s name(s).

  • connective (Symbol) (defaults to: :and)

    The logical connective to use (see CONNECTIVES). Only applies if there are multiple values.

Returns:

  • (self)


# File 'lib/arx/query/query.rb', line 107

#category(*values, connective: :and) ⇒ self

Search for papers by category.

Parameters:

  • values (Array<String>)

    Category(s) of papers to search for.

  • connective (Symbol) (defaults to: :and)

    The logical connective to use (see CONNECTIVES). Only applies if there are multiple values.

Returns:

  • (self)


# File 'lib/arx/query/query.rb', line 139

#comment(*values, exact: true, connective: :and) ⇒ self

Search for papers by comment.

Parameters:

  • values (Array<String>)

    Comment(s) of papers to search for.

  • exact (Boolean) (defaults to: true)

    Whether to search for an exact match of the comment(s).

  • connective (Symbol) (defaults to: :and)

    The logical connective to use (see CONNECTIVES). Only applies if there are multiple values.

Returns:

  • (self)


# File 'lib/arx/query/query.rb', line 123

#groupself

Creates a nested subquery (grouped statements with parentheses).

Returns:

  • (self)


191
192
193
194
195
196
197
198
199
200
# File 'lib/arx/query/query.rb', line 191

def group
  add_connective :and unless end_with_connective?
  @query << (search_query? ? '+' : "&#{PARAMS[:search_query]}=")

  @query << CGI.escape('(')
  yield
  @query << CGI.escape(')')

  self
end

#journal(*values, exact: true, connective: :and) ⇒ self

Search for papers by journal reference.

Parameters:

  • values (Array<String>)

    Journal reference(s) of papers to search for.

  • exact (Boolean) (defaults to: true)

    Whether to search for an exact match of the journal refernece(s).

  • connective (Symbol) (defaults to: :and)

    The logical connective to use (see CONNECTIVES). Only applies if there are multiple values.

Returns:

  • (self)


# File 'lib/arx/query/query.rb', line 131

#orself

Logical disjunction (OR) of subqueries.

Returns:

  • (self)

See Also:



95
96
97
# File 'lib/arx/query/query.rb', line 95

CONNECTIVES.keys.each do |connective|
  define_method(connective) { add_connective connective }
end

#report(*values, connective: :and) ⇒ self

Search for papers by report number.

Parameters:

  • values (Array<String>)

    Report number(s) of papers to search for.

  • connective (Symbol) (defaults to: :and)

    The logical connective to use (see CONNECTIVES). Only applies if there are multiple values.

Returns:

  • (self)


# File 'lib/arx/query/query.rb', line 146

#title(*values, exact: true, connective: :and) ⇒ self

Search for papers by title.

Parameters:

  • values (Array<String>)

    Title(s) of papers to search for.

  • exact (Boolean) (defaults to: true)

    Whether to search for an exact match of the title(s).

  • connective (Symbol) (defaults to: :and)

    The logical connective to use (see CONNECTIVES). Only applies if there are multiple values.

Returns:

  • (self)


# File 'lib/arx/query/query.rb', line 99

#to_sString

Returns the query string.

Returns:

  • (String)


205
206
207
# File 'lib/arx/query/query.rb', line 205

def to_s
  @query
end