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



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

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! &Cleaner.method(:extract_id)
    @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 109

#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)


149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
# File 'lib/arx/query/query.rb', line 149

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 76

#and_notself

Logical negated conjunction (ANDNOT) of subqueries.

Returns:

  • (self)

See Also:



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

#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 102

#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 130

#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 116

#groupself

Creates a nested subquery (grouped statements with parentheses).

Returns:

  • (self)


179
180
181
182
183
184
185
186
187
188
# File 'lib/arx/query/query.rb', line 179

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 123

#orself

Logical disjunction (OR) of subqueries.

Returns:

  • (self)

See Also:



91
92
93
# File 'lib/arx/query/query.rb', line 91

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 136

#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 95

#to_sString

Returns the query string.

Returns:

  • (String)


193
194
195
# File 'lib/arx/query/query.rb', line 193

def to_s
  @query
end