pho 0.3 → 0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/CHANGES +9 -0
- data/Rakefile +2 -1
- data/bin/talis_store +263 -0
- data/doc/rdoc/classes/Pho.html +3 -21
- data/doc/rdoc/classes/Pho/Analyzers.html +22 -0
- data/doc/rdoc/classes/Pho/DatatypeProperty.html +42 -10
- data/doc/rdoc/classes/Pho/Etags.html +102 -30
- data/doc/rdoc/classes/Pho/Facet/Results.html +81 -7
- data/doc/rdoc/classes/Pho/Facet/Term.html +13 -2
- data/doc/rdoc/classes/Pho/FieldPredicateMap.html +233 -30
- data/doc/rdoc/classes/Pho/FieldWeighting.html +38 -10
- data/doc/rdoc/classes/Pho/Job.html +488 -9
- data/doc/rdoc/classes/Pho/JobUpdate.html +141 -0
- data/doc/rdoc/classes/Pho/Jobs.html +538 -0
- data/doc/rdoc/classes/Pho/Namespaces.html +33 -2
- data/doc/rdoc/classes/Pho/QueryProfile.html +162 -20
- data/doc/rdoc/classes/Pho/RDFCollection.html +200 -60
- data/doc/rdoc/classes/Pho/Snapshot.html +162 -36
- data/doc/rdoc/classes/Pho/Status.html +59 -8
- data/doc/rdoc/classes/Pho/Store.html +589 -253
- data/doc/rdoc/created.rid +1 -1
- data/doc/rdoc/files/CHANGES.html +24 -1
- data/doc/rdoc/files/lib/pho/field_predicate_map_rb.html +1 -1
- data/doc/rdoc/files/lib/pho/job_rb.html +1 -1
- data/doc/rdoc/files/lib/pho/snapshot_rb.html +2 -1
- data/doc/rdoc/files/lib/pho/status_rb.html +1 -1
- data/doc/rdoc/files/lib/pho/store_rb.html +1 -1
- data/doc/rdoc/files/lib/pho_rb.html +2 -1
- data/doc/rdoc/fr_class_index.html +2 -0
- data/doc/rdoc/fr_method_index.html +85 -68
- data/lib/pho.rb +18 -10
- data/lib/pho/field_predicate_map.rb +6 -1
- data/lib/pho/job.rb +326 -6
- data/lib/pho/snapshot.rb +46 -19
- data/lib/pho/store.rb +22 -56
- data/tests/tc_job.rb +262 -0
- data/tests/tc_jobcontrol.rb +159 -12
- data/tests/tc_snapshots.rb +57 -28
- data/tests/ts_pho.rb +1 -0
- metadata +9 -110
- data/doc/rdoc/classes/Pho/DatatypeProperty.src/M000034.html +0 -21
- data/doc/rdoc/classes/Pho/DatatypeProperty.src/M000035.html +0 -29
- data/doc/rdoc/classes/Pho/Etags.src/M000088.html +0 -23
- data/doc/rdoc/classes/Pho/Etags.src/M000089.html +0 -28
- data/doc/rdoc/classes/Pho/Etags.src/M000090.html +0 -21
- data/doc/rdoc/classes/Pho/Etags.src/M000091.html +0 -18
- data/doc/rdoc/classes/Pho/Etags.src/M000092.html +0 -18
- data/doc/rdoc/classes/Pho/Etags.src/M000093.html +0 -18
- data/doc/rdoc/classes/Pho/Facet/Results.src/M000001.html +0 -20
- data/doc/rdoc/classes/Pho/Facet/Results.src/M000002.html +0 -27
- data/doc/rdoc/classes/Pho/Facet/Results.src/M000003.html +0 -54
- data/doc/rdoc/classes/Pho/Facet/Term.src/M000004.html +0 -20
- data/doc/rdoc/classes/Pho/FieldPredicateMap.src/M000005.html +0 -38
- data/doc/rdoc/classes/Pho/FieldPredicateMap.src/M000006.html +0 -28
- data/doc/rdoc/classes/Pho/FieldPredicateMap.src/M000007.html +0 -20
- data/doc/rdoc/classes/Pho/FieldPredicateMap.src/M000008.html +0 -18
- data/doc/rdoc/classes/Pho/FieldPredicateMap.src/M000009.html +0 -23
- data/doc/rdoc/classes/Pho/FieldPredicateMap.src/M000010.html +0 -23
- data/doc/rdoc/classes/Pho/FieldPredicateMap.src/M000011.html +0 -18
- data/doc/rdoc/classes/Pho/FieldPredicateMap.src/M000012.html +0 -18
- data/doc/rdoc/classes/Pho/FieldPredicateMap.src/M000013.html +0 -18
- data/doc/rdoc/classes/Pho/FieldPredicateMap.src/M000014.html +0 -18
- data/doc/rdoc/classes/Pho/FieldPredicateMap.src/M000015.html +0 -18
- data/doc/rdoc/classes/Pho/FieldPredicateMap.src/M000016.html +0 -21
- data/doc/rdoc/classes/Pho/FieldPredicateMap.src/M000017.html +0 -21
- data/doc/rdoc/classes/Pho/FieldPredicateMap.src/M000018.html +0 -38
- data/doc/rdoc/classes/Pho/FieldPredicateMap.src/M000019.html +0 -18
- data/doc/rdoc/classes/Pho/FieldWeighting.src/M000075.html +0 -20
- data/doc/rdoc/classes/Pho/FieldWeighting.src/M000076.html +0 -26
- data/doc/rdoc/classes/Pho/Job.src/M000074.html +0 -21
- data/doc/rdoc/classes/Pho/QueryProfile.src/M000024.html +0 -39
- data/doc/rdoc/classes/Pho/QueryProfile.src/M000025.html +0 -24
- data/doc/rdoc/classes/Pho/QueryProfile.src/M000026.html +0 -20
- data/doc/rdoc/classes/Pho/QueryProfile.src/M000027.html +0 -18
- data/doc/rdoc/classes/Pho/QueryProfile.src/M000028.html +0 -18
- data/doc/rdoc/classes/Pho/QueryProfile.src/M000029.html +0 -21
- data/doc/rdoc/classes/Pho/QueryProfile.src/M000030.html +0 -18
- data/doc/rdoc/classes/Pho/QueryProfile.src/M000031.html +0 -18
- data/doc/rdoc/classes/Pho/QueryProfile.src/M000032.html +0 -38
- data/doc/rdoc/classes/Pho/QueryProfile.src/M000033.html +0 -18
- data/doc/rdoc/classes/Pho/RDFCollection.src/M000077.html +0 -23
- data/doc/rdoc/classes/Pho/RDFCollection.src/M000078.html +0 -22
- data/doc/rdoc/classes/Pho/RDFCollection.src/M000079.html +0 -24
- data/doc/rdoc/classes/Pho/RDFCollection.src/M000080.html +0 -23
- data/doc/rdoc/classes/Pho/RDFCollection.src/M000081.html +0 -18
- data/doc/rdoc/classes/Pho/RDFCollection.src/M000082.html +0 -22
- data/doc/rdoc/classes/Pho/RDFCollection.src/M000083.html +0 -22
- data/doc/rdoc/classes/Pho/RDFCollection.src/M000084.html +0 -26
- data/doc/rdoc/classes/Pho/RDFCollection.src/M000085.html +0 -23
- data/doc/rdoc/classes/Pho/RDFCollection.src/M000086.html +0 -18
- data/doc/rdoc/classes/Pho/RDFCollection.src/M000087.html +0 -18
- data/doc/rdoc/classes/Pho/Snapshot.src/M000070.html +0 -31
- data/doc/rdoc/classes/Pho/Snapshot.src/M000071.html +0 -21
- data/doc/rdoc/classes/Pho/Snapshot.src/M000072.html +0 -18
- data/doc/rdoc/classes/Pho/Snapshot.src/M000073.html +0 -37
- data/doc/rdoc/classes/Pho/Status.src/M000020.html +0 -20
- data/doc/rdoc/classes/Pho/Status.src/M000021.html +0 -31
- data/doc/rdoc/classes/Pho/Status.src/M000022.html +0 -18
- data/doc/rdoc/classes/Pho/Status.src/M000023.html +0 -18
- data/doc/rdoc/classes/Pho/Store.src/M000036.html +0 -22
- data/doc/rdoc/classes/Pho/Store.src/M000037.html +0 -18
- data/doc/rdoc/classes/Pho/Store.src/M000038.html +0 -25
- data/doc/rdoc/classes/Pho/Store.src/M000039.html +0 -20
- data/doc/rdoc/classes/Pho/Store.src/M000040.html +0 -20
- data/doc/rdoc/classes/Pho/Store.src/M000041.html +0 -28
- data/doc/rdoc/classes/Pho/Store.src/M000042.html +0 -23
- data/doc/rdoc/classes/Pho/Store.src/M000043.html +0 -18
- data/doc/rdoc/classes/Pho/Store.src/M000044.html +0 -18
- data/doc/rdoc/classes/Pho/Store.src/M000045.html +0 -18
- data/doc/rdoc/classes/Pho/Store.src/M000046.html +0 -18
- data/doc/rdoc/classes/Pho/Store.src/M000047.html +0 -23
- data/doc/rdoc/classes/Pho/Store.src/M000048.html +0 -22
- data/doc/rdoc/classes/Pho/Store.src/M000049.html +0 -26
- data/doc/rdoc/classes/Pho/Store.src/M000050.html +0 -24
- data/doc/rdoc/classes/Pho/Store.src/M000051.html +0 -20
- data/doc/rdoc/classes/Pho/Store.src/M000052.html +0 -20
- data/doc/rdoc/classes/Pho/Store.src/M000053.html +0 -25
- data/doc/rdoc/classes/Pho/Store.src/M000054.html +0 -20
- data/doc/rdoc/classes/Pho/Store.src/M000055.html +0 -30
- data/doc/rdoc/classes/Pho/Store.src/M000056.html +0 -21
- data/doc/rdoc/classes/Pho/Store.src/M000057.html +0 -23
- data/doc/rdoc/classes/Pho/Store.src/M000058.html +0 -28
- data/doc/rdoc/classes/Pho/Store.src/M000059.html +0 -18
- data/doc/rdoc/classes/Pho/Store.src/M000060.html +0 -18
- data/doc/rdoc/classes/Pho/Store.src/M000061.html +0 -18
- data/doc/rdoc/classes/Pho/Store.src/M000062.html +0 -31
- data/doc/rdoc/classes/Pho/Store.src/M000063.html +0 -21
- data/doc/rdoc/classes/Pho/Store.src/M000064.html +0 -20
- data/doc/rdoc/classes/Pho/Store.src/M000065.html +0 -20
- data/doc/rdoc/classes/Pho/Store.src/M000066.html +0 -20
- data/doc/rdoc/classes/Pho/Store.src/M000067.html +0 -20
- data/doc/rdoc/classes/Pho/Store.src/M000068.html +0 -20
- data/doc/rdoc/classes/Pho/Store.src/M000069.html +0 -20
data/doc/rdoc/created.rid
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
Mon, 06 Apr 2009 16:00:04 +0100
|
data/doc/rdoc/files/CHANGES.html
CHANGED
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
</tr>
|
|
57
57
|
<tr class="top-aligned-row">
|
|
58
58
|
<td><strong>Last Update:</strong></td>
|
|
59
|
-
<td>
|
|
59
|
+
<td>Sat Apr 04 19:19:08 +0100 2009</td>
|
|
60
60
|
</tr>
|
|
61
61
|
</table>
|
|
62
62
|
</div>
|
|
@@ -72,6 +72,29 @@
|
|
|
72
72
|
<p>
|
|
73
73
|
Brief notes on significant changes and additions in each release
|
|
74
74
|
</p>
|
|
75
|
+
<h2>Version 0.4</h2>
|
|
76
|
+
<ul>
|
|
77
|
+
<li>Added support for reading Job lifecycle data exposed in Talis Platform
|
|
78
|
+
Release 21
|
|
79
|
+
|
|
80
|
+
</li>
|
|
81
|
+
<li>Added constants for 2 new analysers added in Talis Platform Release 21
|
|
82
|
+
|
|
83
|
+
</li>
|
|
84
|
+
<li>Refactored job submission code to move methods from the Store class onto
|
|
85
|
+
the Jobs and Job classes instead. This brings that code in line with the
|
|
86
|
+
patterns used elsewhere
|
|
87
|
+
|
|
88
|
+
</li>
|
|
89
|
+
<li>Re-implemented snapshot reading code to use RDF/XML rather than scraping
|
|
90
|
+
the HTML
|
|
91
|
+
|
|
92
|
+
</li>
|
|
93
|
+
<li>Added a fledgling command-line tool for working with the platform
|
|
94
|
+
"pho_store"
|
|
95
|
+
|
|
96
|
+
</li>
|
|
97
|
+
</ul>
|
|
75
98
|
<h2>Version 0.3</h2>
|
|
76
99
|
<ul>
|
|
77
100
|
<li>Added support for QueryProfiles, Facets
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
</tr>
|
|
57
57
|
<tr class="top-aligned-row">
|
|
58
58
|
<td><strong>Last Update:</strong></td>
|
|
59
|
-
<td>
|
|
59
|
+
<td>Fri Apr 03 19:09:15 +0100 2009</td>
|
|
60
60
|
</tr>
|
|
61
61
|
</table>
|
|
62
62
|
</div>
|
|
@@ -74,6 +74,7 @@
|
|
|
74
74
|
|
|
75
75
|
<div class="name-list">
|
|
76
76
|
digest/md5
|
|
77
|
+
tmpdir
|
|
77
78
|
</div>
|
|
78
79
|
</div>
|
|
79
80
|
|
|
@@ -56,7 +56,7 @@
|
|
|
56
56
|
</tr>
|
|
57
57
|
<tr class="top-aligned-row">
|
|
58
58
|
<td><strong>Last Update:</strong></td>
|
|
59
|
-
<td>
|
|
59
|
+
<td>Thu Apr 02 17:22:46 +0100 2009</td>
|
|
60
60
|
</tr>
|
|
61
61
|
</table>
|
|
62
62
|
</div>
|
|
@@ -85,6 +85,7 @@
|
|
|
85
85
|
pho/query_profile
|
|
86
86
|
pho/status
|
|
87
87
|
pho/facet
|
|
88
|
+
pho/job
|
|
88
89
|
pho/rdf_collection
|
|
89
90
|
</div>
|
|
90
91
|
</div>
|
|
@@ -30,6 +30,8 @@
|
|
|
30
30
|
<a href="classes/Pho/FieldPredicateMap.html">Pho::FieldPredicateMap</a><br />
|
|
31
31
|
<a href="classes/Pho/FieldWeighting.html">Pho::FieldWeighting</a><br />
|
|
32
32
|
<a href="classes/Pho/Job.html">Pho::Job</a><br />
|
|
33
|
+
<a href="classes/Pho/JobUpdate.html">Pho::JobUpdate</a><br />
|
|
34
|
+
<a href="classes/Pho/Jobs.html">Pho::Jobs</a><br />
|
|
33
35
|
<a href="classes/Pho/Namespaces.html">Pho::Namespaces</a><br />
|
|
34
36
|
<a href="classes/Pho/QueryProfile.html">Pho::QueryProfile</a><br />
|
|
35
37
|
<a href="classes/Pho/RDFCollection.html">Pho::RDFCollection</a><br />
|
|
@@ -20,99 +20,116 @@
|
|
|
20
20
|
<div id="index">
|
|
21
21
|
<h1 class="section-bar">Methods</h1>
|
|
22
22
|
<div id="index-entries">
|
|
23
|
-
<a href="classes/Pho/QueryProfile.html#M000027"><< (Pho::QueryProfile)</a><br />
|
|
24
23
|
<a href="classes/Pho/FieldPredicateMap.html#M000008"><< (Pho::FieldPredicateMap)</a><br />
|
|
25
|
-
<a href="classes/Pho/
|
|
26
|
-
<a href="classes/Pho/Etags.html#
|
|
27
|
-
<a href="classes/Pho/
|
|
28
|
-
<a href="classes/Pho/Store.html#
|
|
29
|
-
<a href="classes/Pho/Store.html#
|
|
30
|
-
<a href="classes/Pho/
|
|
31
|
-
<a href="classes/Pho/
|
|
24
|
+
<a href="classes/Pho/QueryProfile.html#M000027"><< (Pho::QueryProfile)</a><br />
|
|
25
|
+
<a href="classes/Pho/Etags.html#M000107">add (Pho::Etags)</a><br />
|
|
26
|
+
<a href="classes/Pho/Etags.html#M000108">add_from_response (Pho::Etags)</a><br />
|
|
27
|
+
<a href="classes/Pho/Store.html#M000062">augment (Pho::Store)</a><br />
|
|
28
|
+
<a href="classes/Pho/Store.html#M000061">augment_uri (Pho::Store)</a><br />
|
|
29
|
+
<a href="classes/Pho/Snapshot.html#M000081">backup (Pho::Snapshot)</a><br />
|
|
30
|
+
<a href="classes/Pho/Jobs.html#M000040">build_job_request (Pho::Jobs)</a><br />
|
|
31
|
+
<a href="classes/Pho/Store.html#M000048">build_uri (Pho::Store)</a><br />
|
|
32
|
+
<a href="classes/Pho/Job.html#M000087">completed? (Pho::Job)</a><br />
|
|
33
|
+
<a href="classes/Pho/Store.html#M000063">configure_headers_for_conditional_get (Pho::Store)</a><br />
|
|
32
34
|
<a href="classes/Pho/FieldPredicateMap.html#M000006">create_mapping (Pho::FieldPredicateMap)</a><br />
|
|
33
35
|
<a href="classes/Pho/QueryProfile.html#M000025">create_weighting (Pho::QueryProfile)</a><br />
|
|
34
|
-
<a href="classes/Pho/Store.html#
|
|
35
|
-
<a href="classes/Pho/Store.html#
|
|
36
|
-
<a href="classes/Pho/
|
|
37
|
-
<a href="classes/Pho/
|
|
38
|
-
<a href="classes/Pho/
|
|
39
|
-
<a href="classes/Pho/Etags.html#M000092">get (Pho::Etags)</a><br />
|
|
40
|
-
<a href="classes/Pho/FieldPredicateMap.html#M000013">get_by_name (Pho::FieldPredicateMap)</a><br />
|
|
36
|
+
<a href="classes/Pho/Store.html#M000066">delete_item (Pho::Store)</a><br />
|
|
37
|
+
<a href="classes/Pho/Store.html#M000052">describe (Pho::Store)</a><br />
|
|
38
|
+
<a href="classes/Pho/Store.html#M000059">facet (Pho::Store)</a><br />
|
|
39
|
+
<a href="classes/Pho/RDFCollection.html#M000099">failures (Pho::RDFCollection)</a><br />
|
|
40
|
+
<a href="classes/Pho/Etags.html#M000109">get (Pho::Etags)</a><br />
|
|
41
41
|
<a href="classes/Pho/QueryProfile.html#M000028">get_by_name (Pho::QueryProfile)</a><br />
|
|
42
|
+
<a href="classes/Pho/FieldPredicateMap.html#M000013">get_by_name (Pho::FieldPredicateMap)</a><br />
|
|
42
43
|
<a href="classes/Pho/FieldPredicateMap.html#M000014">get_by_uri (Pho::FieldPredicateMap)</a><br />
|
|
43
|
-
<a href="classes/Pho/RDFCollection.html#
|
|
44
|
-
<a href="classes/Pho/Store.html#
|
|
45
|
-
<a href="classes/Pho/Store.html#
|
|
44
|
+
<a href="classes/Pho/RDFCollection.html#M000103">get_fail_file_for (Pho::RDFCollection)</a><br />
|
|
45
|
+
<a href="classes/Pho/Store.html#M000073">get_field_predicate_map (Pho::Store)</a><br />
|
|
46
|
+
<a href="classes/Pho/Store.html#M000067">get_item (Pho::Store)</a><br />
|
|
47
|
+
<a href="classes/Pho/Store.html#M000068">get_job (Pho::Store)</a><br />
|
|
48
|
+
<a href="classes/Pho/Store.html#M000069">get_jobs (Pho::Store)</a><br />
|
|
46
49
|
<a href="classes/Pho/FieldPredicateMap.html#M000009">get_name (Pho::FieldPredicateMap)</a><br />
|
|
47
|
-
<a href="classes/Pho/RDFCollection.html#
|
|
50
|
+
<a href="classes/Pho/RDFCollection.html#M000104">get_ok_file_for (Pho::RDFCollection)</a><br />
|
|
48
51
|
<a href="classes/Pho/FieldPredicateMap.html#M000010">get_property_uri (Pho::FieldPredicateMap)</a><br />
|
|
49
|
-
<a href="classes/Pho/Store.html#
|
|
50
|
-
<a href="classes/Pho/Store.html#
|
|
51
|
-
<a href="classes/Pho/Store.html#
|
|
52
|
-
<a href="classes/Pho/Store.html#
|
|
53
|
-
<a href="classes/Pho/Etags.html#
|
|
54
|
-
<a href="classes/Pho/RDFCollection.html#
|
|
55
|
-
<a href="classes/Pho/QueryProfile.html#M000031">mapped_name? (Pho::QueryProfile)</a><br />
|
|
52
|
+
<a href="classes/Pho/Store.html#M000075">get_query_profile (Pho::Store)</a><br />
|
|
53
|
+
<a href="classes/Pho/Store.html#M000060">get_search_params (Pho::Store)</a><br />
|
|
54
|
+
<a href="classes/Pho/Store.html#M000072">get_snapshots (Pho::Store)</a><br />
|
|
55
|
+
<a href="classes/Pho/Store.html#M000071">get_status (Pho::Store)</a><br />
|
|
56
|
+
<a href="classes/Pho/Etags.html#M000110">has_tag? (Pho::Etags)</a><br />
|
|
57
|
+
<a href="classes/Pho/RDFCollection.html#M000098">list (Pho::RDFCollection)</a><br />
|
|
56
58
|
<a href="classes/Pho/FieldPredicateMap.html#M000011">mapped_name? (Pho::FieldPredicateMap)</a><br />
|
|
59
|
+
<a href="classes/Pho/QueryProfile.html#M000031">mapped_name? (Pho::QueryProfile)</a><br />
|
|
57
60
|
<a href="classes/Pho/FieldPredicateMap.html#M000012">mapped_uri? (Pho::FieldPredicateMap)</a><br />
|
|
58
|
-
<a href="classes/Pho/RDFCollection.html#M000077">new (Pho::RDFCollection)</a><br />
|
|
59
|
-
<a href="classes/Pho/Store.html#M000036">new (Pho::Store)</a><br />
|
|
60
|
-
<a href="classes/Pho/Status.html#M000020">new (Pho::Status)</a><br />
|
|
61
|
-
<a href="classes/Pho/DatatypeProperty.html#M000034">new (Pho::DatatypeProperty)</a><br />
|
|
62
|
-
<a href="classes/Pho/Etags.html#M000088">new (Pho::Etags)</a><br />
|
|
63
|
-
<a href="classes/Pho/FieldWeighting.html#M000075">new (Pho::FieldWeighting)</a><br />
|
|
64
|
-
<a href="classes/Pho/QueryProfile.html#M000026">new (Pho::QueryProfile)</a><br />
|
|
65
61
|
<a href="classes/Pho/FieldPredicateMap.html#M000007">new (Pho::FieldPredicateMap)</a><br />
|
|
62
|
+
<a href="classes/Pho/Job.html#M000082">new (Pho::Job)</a><br />
|
|
63
|
+
<a href="classes/Pho/RDFCollection.html#M000094">new (Pho::RDFCollection)</a><br />
|
|
64
|
+
<a href="classes/Pho/Status.html#M000020">new (Pho::Status)</a><br />
|
|
65
|
+
<a href="classes/Pho/FieldWeighting.html#M000092">new (Pho::FieldWeighting)</a><br />
|
|
66
|
+
<a href="classes/Pho/DatatypeProperty.html#M000044">new (Pho::DatatypeProperty)</a><br />
|
|
66
67
|
<a href="classes/Pho/Facet/Term.html#M000004">new (Pho::Facet::Term)</a><br />
|
|
67
|
-
<a href="classes/Pho/
|
|
68
|
+
<a href="classes/Pho/Store.html#M000046">new (Pho::Store)</a><br />
|
|
69
|
+
<a href="classes/Pho/Etags.html#M000105">new (Pho::Etags)</a><br />
|
|
70
|
+
<a href="classes/Pho/Snapshot.html#M000079">new (Pho::Snapshot)</a><br />
|
|
71
|
+
<a href="classes/Pho/QueryProfile.html#M000026">new (Pho::QueryProfile)</a><br />
|
|
68
72
|
<a href="classes/Pho/Facet/Results.html#M000001">new (Pho::Facet::Results)</a><br />
|
|
69
|
-
<a href="classes/Pho/RDFCollection.html#
|
|
70
|
-
<a href="classes/Pho/Snapshot.html#M000070">parse (Pho::Snapshot)</a><br />
|
|
73
|
+
<a href="classes/Pho/RDFCollection.html#M000101">new_files (Pho::RDFCollection)</a><br />
|
|
71
74
|
<a href="classes/Pho/Facet/Results.html#M000003">parse (Pho::Facet::Results)</a><br />
|
|
72
|
-
<a href="classes/Pho/Job.html#
|
|
73
|
-
<a href="classes/Pho/
|
|
74
|
-
<a href="classes/Pho/
|
|
75
|
-
<a href="classes/Pho/
|
|
75
|
+
<a href="classes/Pho/Job.html#M000084">parse (Pho::Job)</a><br />
|
|
76
|
+
<a href="classes/Pho/Snapshot.html#M000078">parse (Pho::Snapshot)</a><br />
|
|
77
|
+
<a href="classes/Pho/Job.html#M000085">progress_updates (Pho::Job)</a><br />
|
|
78
|
+
<a href="classes/Pho/Store.html#M000074">put_field_predicate_map (Pho::Store)</a><br />
|
|
79
|
+
<a href="classes/Pho/Store.html#M000076">put_query_profile (Pho::Store)</a><br />
|
|
80
|
+
<a href="classes/Pho/Snapshot.html#M000077">read_from_store (Pho::Snapshot)</a><br />
|
|
81
|
+
<a href="classes/Pho/QueryProfile.html#M000024">read_from_store (Pho::QueryProfile)</a><br />
|
|
76
82
|
<a href="classes/Pho/FieldPredicateMap.html#M000005">read_from_store (Pho::FieldPredicateMap)</a><br />
|
|
77
83
|
<a href="classes/Pho/Status.html#M000021">read_from_store (Pho::Status)</a><br />
|
|
78
|
-
<a href="classes/Pho/
|
|
79
|
-
<a href="classes/Pho/
|
|
84
|
+
<a href="classes/Pho/Facet/Results.html#M000002">read_from_store (Pho::Facet::Results)</a><br />
|
|
85
|
+
<a href="classes/Pho/Job.html#M000083">read_from_store (Pho::Job)</a><br />
|
|
86
|
+
<a href="classes/Pho/Jobs.html#M000034">read_from_store (Pho::Jobs)</a><br />
|
|
87
|
+
<a href="classes/Pho/Snapshot.html#M000080">read_md5 (Pho::Snapshot)</a><br />
|
|
80
88
|
<a href="classes/Pho/Status.html#M000022">readable? (Pho::Status)</a><br />
|
|
81
|
-
<a href="classes/Pho/Store.html#
|
|
82
|
-
<a href="classes/Pho/Store.html#M000060">reindex (Pho::Store)</a><br />
|
|
89
|
+
<a href="classes/Pho/Store.html#M000064">record_etags (Pho::Store)</a><br />
|
|
83
90
|
<a href="classes/Pho/QueryProfile.html#M000030">remove (Pho::QueryProfile)</a><br />
|
|
84
91
|
<a href="classes/Pho/FieldPredicateMap.html#M000015">remove (Pho::FieldPredicateMap)</a><br />
|
|
85
92
|
<a href="classes/Pho/FieldPredicateMap.html#M000016">remove_by_name (Pho::FieldPredicateMap)</a><br />
|
|
86
93
|
<a href="classes/Pho/QueryProfile.html#M000029">remove_by_name (Pho::QueryProfile)</a><br />
|
|
87
94
|
<a href="classes/Pho/FieldPredicateMap.html#M000017">remove_by_uri (Pho::FieldPredicateMap)</a><br />
|
|
88
|
-
<a href="classes/Pho/RDFCollection.html#
|
|
89
|
-
<a href="classes/Pho/
|
|
90
|
-
<a href="classes/Pho/
|
|
91
|
-
<a href="classes/Pho/
|
|
92
|
-
<a href="classes/Pho/
|
|
93
|
-
<a href="classes/Pho/Store.html#
|
|
94
|
-
<a href="classes/Pho/Store.html#
|
|
95
|
-
<a href="classes/Pho/Store.html#
|
|
96
|
-
<a href="classes/Pho/Store.html#
|
|
97
|
-
<a href="classes/Pho/Store.html#
|
|
98
|
-
<a href="classes/Pho/Store.html#
|
|
99
|
-
<a href="classes/Pho/
|
|
100
|
-
<a href="classes/Pho/
|
|
101
|
-
<a href="classes/Pho/
|
|
102
|
-
<a href="classes/Pho/Store.html#
|
|
103
|
-
<a href="classes/Pho/Store.html#
|
|
104
|
-
<a href="classes/Pho/
|
|
105
|
-
<a href="classes/Pho/Store.html#
|
|
106
|
-
<a href="classes/Pho/
|
|
107
|
-
<a href="classes/Pho/
|
|
108
|
-
<a href="classes/Pho/
|
|
109
|
-
<a href="classes/Pho/
|
|
110
|
-
<a href="classes/Pho/
|
|
95
|
+
<a href="classes/Pho/RDFCollection.html#M000097">reset (Pho::RDFCollection)</a><br />
|
|
96
|
+
<a href="classes/Pho/RDFCollection.html#M000096">retry_failures (Pho::RDFCollection)</a><br />
|
|
97
|
+
<a href="classes/Pho/Job.html#M000089">running? (Pho::Job)</a><br />
|
|
98
|
+
<a href="classes/Pho/Etags.html#M000106">save (Pho::Etags)</a><br />
|
|
99
|
+
<a href="classes/Pho/Store.html#M000058">search (Pho::Store)</a><br />
|
|
100
|
+
<a href="classes/Pho/Store.html#M000047">set_credentials (Pho::Store)</a><br />
|
|
101
|
+
<a href="classes/Pho/Store.html#M000057">sparql (Pho::Store)</a><br />
|
|
102
|
+
<a href="classes/Pho/Store.html#M000055">sparql_ask (Pho::Store)</a><br />
|
|
103
|
+
<a href="classes/Pho/Store.html#M000054">sparql_construct (Pho::Store)</a><br />
|
|
104
|
+
<a href="classes/Pho/Store.html#M000053">sparql_describe (Pho::Store)</a><br />
|
|
105
|
+
<a href="classes/Pho/Store.html#M000056">sparql_select (Pho::Store)</a><br />
|
|
106
|
+
<a href="classes/Pho/Job.html#M000086">started? (Pho::Job)</a><br />
|
|
107
|
+
<a href="classes/Pho/RDFCollection.html#M000095">store (Pho::RDFCollection)</a><br />
|
|
108
|
+
<a href="classes/Pho/Store.html#M000049">store_data (Pho::Store)</a><br />
|
|
109
|
+
<a href="classes/Pho/Store.html#M000050">store_file (Pho::Store)</a><br />
|
|
110
|
+
<a href="classes/Pho/Store.html#M000051">store_url (Pho::Store)</a><br />
|
|
111
|
+
<a href="classes/Pho/Jobs.html#M000039">submit_job (Pho::Jobs)</a><br />
|
|
112
|
+
<a href="classes/Pho/Store.html#M000070">submit_job (Pho::Store)</a><br />
|
|
113
|
+
<a href="classes/Pho/Jobs.html#M000036">submit_reindex (Pho::Jobs)</a><br />
|
|
114
|
+
<a href="classes/Pho/Jobs.html#M000035">submit_reset (Pho::Jobs)</a><br />
|
|
115
|
+
<a href="classes/Pho/Jobs.html#M000038">submit_restore (Pho::Jobs)</a><br />
|
|
116
|
+
<a href="classes/Pho/Jobs.html#M000037">submit_snapshot (Pho::Jobs)</a><br />
|
|
117
|
+
<a href="classes/Pho/RDFCollection.html#M000100">successes (Pho::RDFCollection)</a><br />
|
|
118
|
+
<a href="classes/Pho/Job.html#M000088">successful? (Pho::Job)</a><br />
|
|
119
|
+
<a href="classes/Pho/RDFCollection.html#M000102">summary (Pho::RDFCollection)</a><br />
|
|
111
120
|
<a href="classes/Pho/QueryProfile.html#M000032">to_rdf (Pho::QueryProfile)</a><br />
|
|
121
|
+
<a href="classes/Pho/FieldPredicateMap.html#M000018">to_rdf (Pho::FieldPredicateMap)</a><br />
|
|
122
|
+
<a href="classes/Pho/DatatypeProperty.html#M000045">to_rdf (Pho::DatatypeProperty)</a><br />
|
|
123
|
+
<a href="classes/Pho/FieldWeighting.html#M000093">to_rdf (Pho::FieldWeighting)</a><br />
|
|
112
124
|
<a href="classes/Pho/FieldPredicateMap.html#M000019">upload (Pho::FieldPredicateMap)</a><br />
|
|
113
125
|
<a href="classes/Pho/QueryProfile.html#M000033">upload (Pho::QueryProfile)</a><br />
|
|
114
|
-
<a href="classes/Pho/Store.html#
|
|
126
|
+
<a href="classes/Pho/Store.html#M000065">upload_item (Pho::Store)</a><br />
|
|
127
|
+
<a href="classes/Pho/Jobs.html#M000042">wait_for (Pho::Jobs)</a><br />
|
|
128
|
+
<a href="classes/Pho/Jobs.html#M000041">wait_for_submitted (Pho::Jobs)</a><br />
|
|
129
|
+
<a href="classes/Pho/Job.html#M000091">with_each (Pho::Job)</a><br />
|
|
130
|
+
<a href="classes/Pho/Job.html#M000090">with_first (Pho::Job)</a><br />
|
|
115
131
|
<a href="classes/Pho/Status.html#M000023">writeable? (Pho::Status)</a><br />
|
|
132
|
+
<a href="classes/Pho/Jobs.html#M000043">yield_job_update (Pho::Jobs)</a><br />
|
|
116
133
|
</div>
|
|
117
134
|
</div>
|
|
118
135
|
</body>
|
data/lib/pho.rb
CHANGED
|
@@ -11,6 +11,7 @@ require 'pho/field_predicate_map'
|
|
|
11
11
|
require 'pho/query_profile'
|
|
12
12
|
require 'pho/status'
|
|
13
13
|
require 'pho/facet'
|
|
14
|
+
require 'pho/job'
|
|
14
15
|
require 'pho/rdf_collection'
|
|
15
16
|
|
|
16
17
|
module Pho
|
|
@@ -19,19 +20,26 @@ module Pho
|
|
|
19
20
|
ACCEPT_JSON = { "Accept" => "application/json" }.freeze
|
|
20
21
|
|
|
21
22
|
RDF_XML = {"Content-Type"=>"application/rdf+xml"}.freeze
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
JOB_SNAPSHOT = "http://schemas.talis.com/2006/bigfoot/configuration#SnapshotJob".freeze
|
|
25
|
-
JOB_REINDEX = "http://schemas.talis.com/2006/bigfoot/configuration#ReindexJob".freeze
|
|
26
|
-
JOB_RESTORE = "http://schemas.talis.com/2006/bigfoot/configuration#RestoreJob".freeze
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
module Namespaces
|
|
23
|
+
|
|
24
|
+
class Namespaces
|
|
30
25
|
|
|
31
26
|
CONFIG = "http://schemas.talis.com/2006/bigfoot/configuration#"
|
|
32
27
|
FRAME = "http://schemas.talis.com/2006/frame/schema#"
|
|
33
28
|
FACET = "http://schemas.talis.com/2007/facet-results#"
|
|
34
|
-
|
|
29
|
+
RDF = "http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
|
30
|
+
RDFS = "http://www.w3.org/2000/01/rdf-schema#"
|
|
31
|
+
DC = "http://purl.org/dc/elements/1.1/"
|
|
32
|
+
DC_TERMS = "http://purl.org/dc/terms/"
|
|
33
|
+
|
|
34
|
+
MAPPING = {
|
|
35
|
+
"bf" => CONFIG,
|
|
36
|
+
"frm" => FRAME,
|
|
37
|
+
"rdf" => RDF,
|
|
38
|
+
"rdfs" => RDFS,
|
|
39
|
+
"dc" => DC,
|
|
40
|
+
"dcterms" => DC_TERMS
|
|
41
|
+
}
|
|
42
|
+
|
|
35
43
|
end
|
|
36
|
-
|
|
44
|
+
|
|
37
45
|
end
|
|
@@ -42,7 +42,12 @@ module Pho
|
|
|
42
42
|
#English analyzer without stop words and with accent support. This is identical to the standard English analyzer but all words are indexed plus any accented characters in the ISO Latin 1 character set are replaced by their unaccented equivalent
|
|
43
43
|
#See API documentation at http://n2.talis.com/wiki/Field_Predicate_Map for details of replacements
|
|
44
44
|
NORMALISE_STANDARD = "http://schemas.talis.com/2007/bigfoot/analyzers#norm-en".freeze
|
|
45
|
-
|
|
45
|
+
|
|
46
|
+
#English analyzer with porter stemming, case normalization, latin 1 normalization, and stop words removal
|
|
47
|
+
PORTER_NORMALIZE_STANDARD = "http://schemas.talis.com/2007/bigfoot/analyzers#porter-norm-en".freeze
|
|
48
|
+
|
|
49
|
+
#English analyzer with porter stemming, case normalization and latin 1 normalization.
|
|
50
|
+
PORTER_NO_STOP_WORD_STANDARD = "http://schemas.talis.com/2007/bigfoot/analyzers#porter-nostop-norm-en".freeze
|
|
46
51
|
end
|
|
47
52
|
|
|
48
53
|
#Captures information about a mapped datatype from a Field Predicate Map
|
data/lib/pho/job.rb
CHANGED
|
@@ -1,17 +1,337 @@
|
|
|
1
1
|
module Pho
|
|
2
|
+
|
|
3
|
+
#TODO job deletion
|
|
4
|
+
|
|
5
|
+
class Jobs
|
|
6
|
+
|
|
7
|
+
RESET = "http://schemas.talis.com/2006/bigfoot/configuration#ResetDataJob".freeze
|
|
8
|
+
SNAPSHOT = "http://schemas.talis.com/2006/bigfoot/configuration#SnapshotJob".freeze
|
|
9
|
+
REINDEX = "http://schemas.talis.com/2006/bigfoot/configuration#ReindexJob".freeze
|
|
10
|
+
RESTORE = "http://schemas.talis.com/2006/bigfoot/configuration#RestoreJob".freeze
|
|
11
|
+
|
|
12
|
+
#Reads the current list of scheduled jobs from the provided store. Returns an array of
|
|
13
|
+
#job names
|
|
14
|
+
#
|
|
15
|
+
# store:: store from which to read the scheduled job list
|
|
16
|
+
def Jobs.read_from_store(store)
|
|
17
|
+
resp = store.get_jobs()
|
|
18
|
+
if resp.status != 200
|
|
19
|
+
raise "Unable to read jobs from store. Status was {resp.status}"
|
|
20
|
+
end
|
|
21
|
+
jobs = Array.new
|
|
22
|
+
|
|
23
|
+
doc = REXML::Document.new(resp.content)
|
|
24
|
+
REXML::XPath.each(doc.root, "//bf:job", Pho::Namespaces::MAPPING).each do |el|
|
|
25
|
+
jobs << el.attributes["rdf:resource"]
|
|
26
|
+
end
|
|
27
|
+
return jobs
|
|
28
|
+
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
#Submit a reset job to the Platform
|
|
32
|
+
#
|
|
33
|
+
#This method submits the job, and will return an HTTP:Message indicating the
|
|
34
|
+
#response from the Platform. Client code should check this for success. As job
|
|
35
|
+
#processing may not be immediate, clients should determine the URI of the newly created
|
|
36
|
+
#job and then monitor the jobs status if they need to wait for the job to finish.
|
|
37
|
+
def Jobs.submit_reset(store, label="Reset my store", t=Time.now)
|
|
38
|
+
return submit_job(store, Pho::Jobs::RESET, label, t)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
#Submit a reindex job to the Platform
|
|
42
|
+
#
|
|
43
|
+
#This method submits the job, and will return an HTTP:Message indicating the
|
|
44
|
+
#response from the Platform. Client code should check this for success. As job
|
|
45
|
+
#processing may not be immediate, clients should determine the URI of the newly created
|
|
46
|
+
#job and then monitor the jobs status if they need to wait for the job to finish.
|
|
47
|
+
def Jobs.submit_reindex(store, label="Reindex my store", t=Time.now)
|
|
48
|
+
return submit_job(store, Pho::Jobs::REINDEX, label, t)
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
#Submit a snapshot job to the Platform
|
|
52
|
+
#
|
|
53
|
+
#This method submits the job, and will return an HTTP:Message indicating the
|
|
54
|
+
#response from the Platform. Client code should check this for success. As job
|
|
55
|
+
#processing may not be immediate, clients should determine the URI of the newly created
|
|
56
|
+
#job and then monitor the jobs status if they need to wait for the job to finish.
|
|
57
|
+
def Jobs.submit_snapshot(store, label="Snapshot my store", t=Time.now)
|
|
58
|
+
return submit_job(store, Pho::Jobs::SNAPSHOT, label, t)
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
#Submit a restore job to the Platform
|
|
62
|
+
#
|
|
63
|
+
#This method submits the job, and will return an HTTP:Message indicating the
|
|
64
|
+
#response from the Platform. Client code should check this for success. As job
|
|
65
|
+
#processing may not be immediate, clients should determine the URI of the newly created
|
|
66
|
+
#job and then monitor the jobs status if they need to wait for the job to finish.
|
|
67
|
+
def Jobs.submit_restore(store, snapshot_uri, label="Restore my snapshot", t=Time.now)
|
|
68
|
+
return submit_job(store, Pho::Jobs::RESTORE, label, t, snapshot_uri)
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
#Generic submit job method
|
|
72
|
+
def Jobs.submit_job(store, jobtype, label, t=Time.now, snapshot_uri=nil)
|
|
73
|
+
store.submit_job( build_job_request(jobtype, label, t, snapshot_uri) )
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
# Construct an RDF/XML document containing a job request for submitting to the Platform.
|
|
77
|
+
#
|
|
78
|
+
# t:: a Time object, specifying the time at which the request should be carried out
|
|
79
|
+
def Jobs.build_job_request(type, label, t=Time.now, snapshot_uri=nil)
|
|
80
|
+
|
|
81
|
+
time = t.getutc.strftime("%Y-%m-%dT%H:%M:%SZ")
|
|
82
|
+
data = "<rdf:RDF xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" "
|
|
83
|
+
data << " xmlns:rdfs=\"http://www.w3.org/2000/01/rdf-schema#\" "
|
|
84
|
+
data << " xmlns:bf=\"http://schemas.talis.com/2006/bigfoot/configuration#\"> "
|
|
85
|
+
data << " <bf:JobRequest>"
|
|
86
|
+
data << " <rdfs:label>#{label}</rdfs:label>"
|
|
87
|
+
data << " <bf:jobType rdf:resource=\"#{type}\"/>"
|
|
88
|
+
data << " <bf:startTime>#{time}</bf:startTime>"
|
|
89
|
+
|
|
90
|
+
if (snapshot_uri != nil)
|
|
91
|
+
data << " <bf:snapshotUri rdf:resource=\"#{snapshot_uri}\"/>"
|
|
92
|
+
end
|
|
93
|
+
|
|
94
|
+
data << " </bf:JobRequest>"
|
|
95
|
+
data << "</rdf:RDF>"
|
|
96
|
+
return data
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
#Wait for a newly submitted job to finish
|
|
100
|
+
def Jobs.wait_for_submitted(resp, store, interval=1, &block)
|
|
101
|
+
if resp.status != 201
|
|
102
|
+
raise "Unable to wait, job was not created. Status was #{resp.status}"
|
|
103
|
+
end
|
|
104
|
+
job_url = resp.header["Location"].first
|
|
105
|
+
return wait_for(job_url, store, interval, &block)
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
#Wait for the specified job to finish
|
|
109
|
+
#
|
|
110
|
+
#The method will repeatedly contact the Platform to determine whether the job has finished
|
|
111
|
+
#executing. The requests are made at configurable intervals (once a minute by default). If
|
|
112
|
+
#a block is supplied, then it is passed a reference to the Job (containing current progress
|
|
113
|
+
#updates) after each request. The Job object is returned once completed.
|
|
114
|
+
#
|
|
115
|
+
# uri:: URI of the job to wait for
|
|
116
|
+
# store:: the store on which the job is running
|
|
117
|
+
# interval:: the interval at which checks will be made, in minutes. Default is 1
|
|
118
|
+
def Jobs.wait_for(uri, store, interval=1, &block)
|
|
119
|
+
updates = 0
|
|
120
|
+
job = Job.read_from_store(uri, store)
|
|
121
|
+
updates = yield_job_update(job, updates, &block)
|
|
122
|
+
while !job.completed?
|
|
123
|
+
sleep interval*60
|
|
124
|
+
job = Job.read_from_store(uri, store)
|
|
125
|
+
updates = yield_job_update(job, updates, &block)
|
|
126
|
+
end
|
|
127
|
+
return job
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
protected
|
|
131
|
+
|
|
132
|
+
def Jobs.yield_job_update(job, updates)
|
|
133
|
+
if block_given?
|
|
134
|
+
if job.started?
|
|
135
|
+
|
|
136
|
+
#only yield start message if we've not seen any updates
|
|
137
|
+
if updates == 0
|
|
138
|
+
yield job, job.start_message, job.actual_start_time
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
if job.progress_updates.length > 0
|
|
142
|
+
unseen = job.progress_updates[updates, job.progress_updates.length]
|
|
143
|
+
unseen.each do |update|
|
|
144
|
+
yield job, update.message, update.time
|
|
145
|
+
end
|
|
146
|
+
updates = job.progress_updates.length
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
if job.completed?
|
|
150
|
+
yield job, job.completion_message, job.end_time
|
|
151
|
+
end
|
|
152
|
+
|
|
153
|
+
end
|
|
154
|
+
end
|
|
155
|
+
return updates
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
end
|
|
2
159
|
|
|
3
|
-
#
|
|
4
|
-
class
|
|
160
|
+
#Simple object encapsulating the status message and time for a job update
|
|
161
|
+
class JobUpdate
|
|
5
162
|
|
|
163
|
+
#the status message
|
|
164
|
+
attr_accessor :message
|
|
165
|
+
#the time at which the update was logged
|
|
166
|
+
attr_accessor :time
|
|
6
167
|
|
|
7
|
-
|
|
8
|
-
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
# A Platform Job
|
|
171
|
+
#
|
|
172
|
+
# Instances of this class encapsulate all of the core metadata relating to a Platform Job.
|
|
173
|
+
# This includes not only the timing information but also the completion status, etc.
|
|
174
|
+
#
|
|
175
|
+
# The class provides convenience methods for retrieving and parsing data about a specific
|
|
176
|
+
# Job from a platform store
|
|
177
|
+
class Job
|
|
178
|
+
|
|
179
|
+
SUCCESS = "http://schemas.talis.com/2006/bigfoot/configuration#success"
|
|
180
|
+
ABORTED = "http://schemas.talis.com/2006/bigfoot/configuration#aborted"
|
|
181
|
+
|
|
182
|
+
#URI of the job
|
|
183
|
+
attr_reader :uri
|
|
184
|
+
#Label associated with job
|
|
185
|
+
attr_reader :label
|
|
186
|
+
#Type of job
|
|
187
|
+
attr_reader :type
|
|
188
|
+
#Date-time that the job was created
|
|
189
|
+
attr_reader :created
|
|
190
|
+
#Date-time that the job will start
|
|
191
|
+
attr_reader :start_time
|
|
192
|
+
#Date-time that the job actually started
|
|
193
|
+
attr_accessor :actual_start_time
|
|
194
|
+
#URI of snapshot to load. (For RestoreJob only)
|
|
195
|
+
attr_accessor :snapshot_uri
|
|
196
|
+
#Message recorded at the time the job started
|
|
197
|
+
attr_accessor :start_message
|
|
198
|
+
#An array of JobUpdate instances. May be empty if no updates have been logged
|
|
199
|
+
attr_accessor :progress_updates
|
|
200
|
+
#URI indicating completion status of the job
|
|
201
|
+
attr_accessor :completion_status
|
|
202
|
+
#Completion message
|
|
203
|
+
attr_accessor :completion_message
|
|
204
|
+
#Date time that the job actually completed
|
|
205
|
+
attr_accessor :end_time
|
|
206
|
+
|
|
207
|
+
#Constructor. Used in the reading/parsing code
|
|
208
|
+
#
|
|
209
|
+
#uri:: a unique identifier for the job
|
|
210
|
+
#label:: a description of the job
|
|
211
|
+
#type:: the type of the job, e.g. Pho::Jobs::RESTORE
|
|
212
|
+
#created:: date-time the job was created in the system
|
|
213
|
+
#start_time:: scheduled start time for the job
|
|
214
|
+
def initialize(uri, label, type, start_time, created=nil)
|
|
215
|
+
@uri = uri
|
|
216
|
+
@label = label
|
|
217
|
+
@type = type
|
|
218
|
+
@created = created
|
|
219
|
+
@start_time = start_time
|
|
220
|
+
@progress_updates = Array.new
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
#Read a job from a store
|
|
224
|
+
#
|
|
225
|
+
#uri:: uri of the job to read
|
|
226
|
+
#store:: store from which the job will be read
|
|
227
|
+
def Job.read_from_store(uri, store)
|
|
228
|
+
resp = store.get_job(uri)
|
|
9
229
|
if resp.status != 200
|
|
10
|
-
|
|
230
|
+
raise "Unable to read job from store. Response code was #{resp.status}"
|
|
231
|
+
end
|
|
232
|
+
|
|
233
|
+
return parse(uri, resp.content)
|
|
234
|
+
end
|
|
235
|
+
|
|
236
|
+
#Parses job metadata returned from the platform as RDF/XML, creating a fully populated
|
|
237
|
+
#Job instance
|
|
238
|
+
#
|
|
239
|
+
#uri:: uri of the job to be parsed
|
|
240
|
+
#xml:: the RDF/XML text to be parsed
|
|
241
|
+
def Job.parse(uri, xml)
|
|
242
|
+
doc = REXML::Document.new(xml)
|
|
243
|
+
root = doc.root
|
|
244
|
+
|
|
245
|
+
#job_el = REXML::XPath.first(root, "rdf:Description[rdf:type]", Pho::Namespaces::MAPPING )
|
|
246
|
+
job_el = REXML::XPath.first(root, "//*[@rdf:about='#{uri}']", Pho::Namespaces::MAPPING )
|
|
247
|
+
uri = job_el.attributes["rdf:about"]
|
|
248
|
+
label = REXML::XPath.first(job_el, "rdfs:label", Pho::Namespaces::MAPPING ).text
|
|
249
|
+
type_el = REXML::XPath.first(job_el, "rdf:type", Pho::Namespaces::MAPPING )
|
|
250
|
+
type = type_el.attributes["rdf:resource"]
|
|
251
|
+
created = REXML::XPath.first(job_el, "dcterms:created", Pho::Namespaces::MAPPING ).text
|
|
252
|
+
start_time = REXML::XPath.first(job_el, "bf:startTime", Pho::Namespaces::MAPPING ).text
|
|
253
|
+
|
|
254
|
+
job = Job.new(uri, label, type, start_time, created)
|
|
255
|
+
if type == Pho::Jobs::RESTORE
|
|
256
|
+
with_first(job_el, "bf:snapshotUri") do |uri|
|
|
257
|
+
job.snapshot_uri = uri.attributes["rdf:resource"]
|
|
258
|
+
end
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
with_first(job_el, "bf:actualStartTime") do |el|
|
|
262
|
+
job.actual_start_time = el.text
|
|
263
|
+
end
|
|
264
|
+
with_first(job_el, "bf:startMessage") do |el|
|
|
265
|
+
job.start_message = el.text
|
|
266
|
+
end
|
|
267
|
+
with_first(job_el, "bf:completionMessage") do |el|
|
|
268
|
+
job.completion_message = el.text
|
|
269
|
+
end
|
|
270
|
+
with_first(job_el, "bf:endTime") do |el|
|
|
271
|
+
job.end_time = el.text
|
|
272
|
+
end
|
|
273
|
+
with_first(job_el, "bf:completionStatus") do |el|
|
|
274
|
+
job.completion_status = el.attributes["rdf:resource"]
|
|
275
|
+
end
|
|
276
|
+
with_each(job_el, "bf:progressUpdate") do |el|
|
|
277
|
+
update = JobUpdate.new
|
|
278
|
+
with_first(el, "bf:progressUpdateMessage") do |msg|
|
|
279
|
+
update.message = msg.text
|
|
280
|
+
end
|
|
281
|
+
with_first(el, "bf:progressUpdateTime") do |time|
|
|
282
|
+
update.time = time.text
|
|
283
|
+
end
|
|
284
|
+
job.progress_updates << update
|
|
11
285
|
end
|
|
12
|
-
|
|
286
|
+
|
|
287
|
+
return job
|
|
288
|
+
|
|
289
|
+
end
|
|
290
|
+
|
|
291
|
+
def progress_updates()
|
|
292
|
+
@progress_updates.sort! { |x,y|
|
|
293
|
+
x.time <=> y.time
|
|
294
|
+
}
|
|
295
|
+
return @progress_updates
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
#Has the job started?
|
|
299
|
+
def started?
|
|
300
|
+
return @actual_start_time != nil
|
|
301
|
+
end
|
|
302
|
+
|
|
303
|
+
#Has the job completed?
|
|
304
|
+
def completed?
|
|
305
|
+
return @completion_status != nil
|
|
306
|
+
end
|
|
307
|
+
|
|
308
|
+
#Was the job successful?
|
|
309
|
+
def successful?
|
|
310
|
+
return self.completed? && @completion_status == Pho::Job::SUCCESS
|
|
13
311
|
end
|
|
312
|
+
|
|
313
|
+
#Is the job still running?
|
|
314
|
+
def running?
|
|
315
|
+
return started? && !completed?
|
|
316
|
+
end
|
|
317
|
+
|
|
318
|
+
protected
|
|
319
|
+
|
|
320
|
+
def Job.with_first(el, xpath)
|
|
321
|
+
found_el = REXML::XPath.first(el, xpath, Pho::Namespaces::MAPPING)
|
|
322
|
+
if found_el != nil
|
|
323
|
+
yield found_el
|
|
324
|
+
end
|
|
325
|
+
end
|
|
14
326
|
|
|
327
|
+
def Job.with_each(el, xpath)
|
|
328
|
+
REXML::XPath.each(el, xpath, Pho::Namespaces::MAPPING) do |e|
|
|
329
|
+
root = e.document.root
|
|
330
|
+
uri = e.attributes["rdf:resource"]
|
|
331
|
+
ref_el = REXML::XPath.first(root, "//*[@rdf:about='#{uri}']", Pho::Namespaces::MAPPING)
|
|
332
|
+
yield ref_el
|
|
333
|
+
end
|
|
334
|
+
end
|
|
15
335
|
end
|
|
16
336
|
|
|
17
337
|
end
|