Module: MediaWiki::Gateway::Query

Included in:
MediaWiki::Gateway
Defined in:
lib/media_wiki/gateway/query.rb

Instance Method Summary collapse

Instance Method Details

#custom_query(options) ⇒ Object

Make a custom query

[options] query options

Returns the REXML::Element object as result

Example:

def creation_time(pagename)
res = bot.custom_query(:prop => :revisions,
                       :titles => pagename,
                       :rvprop => :timestamp,
                       :rvdir => :newer,
                       :rvlimit => 1)
timestr = res.get_elements('*/*/*/rev')[0].attribute('timestamp').to_s
time.parse(timestr)
end


86
87
88
89
90
# File 'lib/media_wiki/gateway/query.rb', line 86

def custom_query(options)
  form_data = {}
  options.each { |k, v| form_data[k.to_s] = v.to_s }
  send_request(form_data.merge('action' => 'query')).elements['query']
end

#search(key, namespaces = nil, limit = @options[:limit], max_results = @options[:max_results], options = {}) ⇒ Object

Get a list of pages with matching content in given namespaces

[key] Search key [namespaces] Array of namespace names to search (defaults to main only) [limit] Maximum number of hits to ask for (defaults to 500; note that Wikimedia Foundation wikis allow only 50 for normal users) [max_results] Maximum total number of results to return [options] Hash of additional options

Returns array of page titles (empty if no matches)



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/media_wiki/gateway/query.rb', line 16

def search(key, namespaces = nil, limit = @options[:limit], max_results = @options[:max_results], options = {})
  titles, offset, form_data = [], 0, options.merge(
    'action'   => 'query',
    'list'     => 'search',
    'srwhat'   => 'text',
    'srsearch' => key,
    'srlimit'  => limit
  )

  if namespaces
    form_data['srnamespace'] = Array(namespaces).map! { |ns|
      namespaces_by_prefix[ns]
    }.compact.join('|')
  end

  begin
    form_data['sroffset'] = offset if offset
    form_data['srlimit']  = [limit, max_results - offset.to_i].min

    res, offset = make_api_request(form_data, '//query-continue/search/@sroffset')

    titles += REXML::XPath.match(res, '//p').map { |x| x.attributes['title'] }
  end while offset && offset.to_i < max_results.to_i

  titles
end

#semantic_query(query, params = [], options = {}) ⇒ Object

Execute Semantic Mediawiki query

[query] Semantic Mediawiki query [params] Array of additional parameters or options, eg. mainlabel=Foo or ?Place (optional) [options] Hash of additional options

Returns result as an HTML string



50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'lib/media_wiki/gateway/query.rb', line 50

def semantic_query(query, params = [], options = {})
  unless smw_version = extensions['Semantic MediaWiki']
    raise MediaWiki::Exception, 'Semantic MediaWiki extension not installed.'
  end

  if smw_version.to_f >= 1.7
    send_request(options.merge(
      'action' => 'ask',
      'query'  => [query, *params].join('|')
    ))
  else
    send_request(options.merge(
      'action' => 'parse',
      'prop'   => 'text',
      'text'   => "{{#ask:#{[query, 'format=list', *params].join('|')}}}"
    )).elements['parse/text'].text
  end
end