1
|
<?php
|
2
|
|
3
|
/**
|
4
|
* @file
|
5
|
* Migration support for voting api.
|
6
|
*/
|
7
|
class MigrateDestinationVotingApiVote extends MigrateDestination {
|
8
|
|
9
|
protected $importedIds = array();
|
10
|
|
11
|
/**
|
12
|
* Threshold of count of id's after which votes will be recalculated.
|
13
|
*
|
14
|
* @var int
|
15
|
*/
|
16
|
protected $idRecalculationThreshold = 1000;
|
17
|
|
18
|
static public function getKeySchema() {
|
19
|
return array(
|
20
|
'vote_id' => array(
|
21
|
'type' => 'int',
|
22
|
'unsigned' => TRUE,
|
23
|
'not null' => TRUE,
|
24
|
'description' => 'Vote ID',
|
25
|
),
|
26
|
);
|
27
|
}
|
28
|
|
29
|
/**
|
30
|
* {@inheritdoc}
|
31
|
*/
|
32
|
public function __toString() {
|
33
|
return t('Voting API Vote');
|
34
|
}
|
35
|
|
36
|
/**
|
37
|
* {@inheritdoc}
|
38
|
*/
|
39
|
public function fields() {
|
40
|
return array(
|
41
|
'vote_id' => 'Vote ID',
|
42
|
'entity_type' => "Entity Type (defaults to 'node')",
|
43
|
'entity_id' => 'Entity ID',
|
44
|
'value' => 'Numeric vote value',
|
45
|
'value_type' => "Value type (percent/points, defaults to 'percent')",
|
46
|
'tag' => "Tag (defaults to 'vote')",
|
47
|
'uid' => 'User ID',
|
48
|
'timestamp' => 'Timestamp',
|
49
|
'vote_source' => 'Vote Source IP Address',
|
50
|
);
|
51
|
}
|
52
|
|
53
|
/**
|
54
|
* {@inheritdoc}
|
55
|
*/
|
56
|
public function import(stdClass $votingapi_vote, stdClass $row) {
|
57
|
$updating = FALSE;
|
58
|
$vote = array();
|
59
|
if (isset($row->migrate_map_destid1)) {
|
60
|
// We're updating an existing vote - start from the previous data.
|
61
|
$votes = votingapi_select_votes(array('vote_id' => $row->migrate_map_destid1));
|
62
|
if (count($votes)) {
|
63
|
$vote = reset($votes);
|
64
|
$updating = TRUE;
|
65
|
}
|
66
|
}
|
67
|
|
68
|
if (!$updating) {
|
69
|
unset($votingapi_vote->vote_id);
|
70
|
}
|
71
|
|
72
|
$this->prepare($votingapi_vote, $row);
|
73
|
|
74
|
// Votes have to be assigned to an entity.
|
75
|
if (empty($votingapi_vote->entity_id)) {
|
76
|
watchdog('VotingAPI Import', 'Skipped import due to empty entity_id for vote import: @serial', array('@serial' => json_encode($row)), WATCHDOG_ERROR);
|
77
|
return FALSE;
|
78
|
}
|
79
|
|
80
|
migrate_instrument_start('votingapi_vote_save');
|
81
|
// Just converting $entity to an array doesn't work...
|
82
|
$vote = array();
|
83
|
foreach ((array) $votingapi_vote as $field => $value) {
|
84
|
$vote[$field] = $value;
|
85
|
}
|
86
|
votingapi_add_votes($vote);
|
87
|
migrate_instrument_stop('votingapi_vote_save');
|
88
|
|
89
|
if (isset($vote[0]['vote_id'])) {
|
90
|
$votingapi_vote->vote_id = $vote[0]['vote_id'];
|
91
|
$this->complete($votingapi_vote, $row);
|
92
|
|
93
|
// Store the ID in the hash as it is faster than getting uniques later.
|
94
|
$this->importedIds[$votingapi_vote->entity_type][$votingapi_vote->entity_id] = TRUE;
|
95
|
|
96
|
// If we hit the threshold of entity id's we imported, we should
|
97
|
// recalculate to avoid excessive memory usage (and clear out the array).
|
98
|
if (count($this->importedIds[$votingapi_vote->entity_type]) >= $this->idRecalculationThreshold) {
|
99
|
$this->recalculateResults($votingapi_vote->entity_type, array_keys($this->importedIds[$votingapi_vote->entity_type]));
|
100
|
$this->importedIds[$votingapi_vote->entity_type] = array();
|
101
|
}
|
102
|
|
103
|
if ($updating) {
|
104
|
$this->numUpdated++;
|
105
|
}
|
106
|
else {
|
107
|
$this->numCreated++;
|
108
|
}
|
109
|
return array($votingapi_vote->vote_id);
|
110
|
}
|
111
|
else {
|
112
|
return FALSE;
|
113
|
}
|
114
|
}
|
115
|
|
116
|
/**
|
117
|
* Recalculate votes for a list of id's.
|
118
|
*
|
119
|
* @param string $entity_type
|
120
|
* The entity type of the id's
|
121
|
* @param array $ids
|
122
|
* List of the ID's for which votes are to be recalculated.
|
123
|
*/
|
124
|
protected function recalculateResults($entity_type, array $ids) {
|
125
|
foreach ($ids as $entity_id) {
|
126
|
votingapi_recalculate_results($entity_type, $entity_id, TRUE);
|
127
|
}
|
128
|
}
|
129
|
|
130
|
/**
|
131
|
* We're done with importing votes, recalculate the results.
|
132
|
*/
|
133
|
public function postImport() {
|
134
|
foreach ($this->importedIds as $entity_type => $entity_ids) {
|
135
|
$this->recalculateResults($entity_type, array_keys($entity_ids));
|
136
|
}
|
137
|
}
|
138
|
|
139
|
/**
|
140
|
* Delete the provided votes and recalculate the results.
|
141
|
*
|
142
|
* @param array $ids
|
143
|
* ID's to be deleted.
|
144
|
*/
|
145
|
public function bulkRollback(array $ids) {
|
146
|
migrate_instrument_start(__METHOD__);
|
147
|
|
148
|
foreach ($ids as $id) {
|
149
|
$votes[]['vote_id'] = $id;
|
150
|
}
|
151
|
votingapi_delete_votes($votes);
|
152
|
|
153
|
migrate_instrument_stop(__METHOD__);
|
154
|
}
|
155
|
|
156
|
public function prepare($vote, stdClass $source_row) {
|
157
|
$migration = Migration::currentMigration();
|
158
|
if (method_exists($migration, 'prepare')) {
|
159
|
$vote->migrate = array(
|
160
|
'machineName' => $migration->getMachineName(),
|
161
|
);
|
162
|
$migration->prepare($vote, $source_row);
|
163
|
}
|
164
|
}
|
165
|
|
166
|
public function complete($entity, stdClass $source_row) {
|
167
|
// Call any complete handler for this specific Migration.
|
168
|
$migration = Migration::currentMigration();
|
169
|
if (method_exists($migration, 'complete')) {
|
170
|
try {
|
171
|
$migration->complete($entity, $source_row);
|
172
|
} catch (Exception $e) {
|
173
|
// If we catch any errors here, save the messages without letting
|
174
|
// the exception prevent the saving of the question.
|
175
|
$migration->saveMessage($e->getMessage());
|
176
|
}
|
177
|
}
|
178
|
}
|
179
|
|
180
|
/**
|
181
|
* Give handlers a shot at cleaning up before a question has been rolled back.
|
182
|
*
|
183
|
* @param $entity_id
|
184
|
* ID of the entity about to be deleted..
|
185
|
*/
|
186
|
public function prepareRollback($entity_id) {
|
187
|
// Call any prepare handler for this specific Migration.
|
188
|
$migration = Migration::currentMigration();
|
189
|
if (method_exists($migration, 'prepareRollback')) {
|
190
|
$migration->prepareRollback($entity_id);
|
191
|
}
|
192
|
}
|
193
|
|
194
|
/**
|
195
|
* Give handlers a shot at cleaning up after an entity has been rolled back.
|
196
|
*
|
197
|
* @param $entity_id
|
198
|
* ID of the entity which has been deleted.
|
199
|
*/
|
200
|
public function completeRollback($entity_id) {
|
201
|
// Call any complete handler for this specific Migration.
|
202
|
$migration = Migration::currentMigration();
|
203
|
if (method_exists($migration, 'completeRollback')) {
|
204
|
$migration->completeRollback($entity_id);
|
205
|
}
|
206
|
}
|
207
|
|
208
|
}
|