/**
* @return string
*/
public function migrate_relationships()
{
if (true === $this->check_progress(__FUNCTION__)) {
return '1';
}
$migration_limit = (int) apply_filters('pods_upgrade_item_limit', 1500);
$migration_limit = max($migration_limit, 100);
$last_id = (int) $this->check_progress(__FUNCTION__);
$sql = "\n SELECT `r`.*, `p`.`tbl_row_id` AS `real_id`, `p`.`datatype`\n FROM `@wp_pod_rel` AS `r`\n LEFT JOIN `@wp_pod` AS `p` ON `p`.`id` = `r`.`pod_id`\n WHERE {$last_id} < `r`.`id`\n AND `r`.`pod_id` IS NOT NULL\n AND `r`.`field_id` IS NOT NULL\n AND `p`.`id` IS NOT NULL\n ORDER BY `r`.`id`\n LIMIT 0, {$migration_limit}\n ";
$rel = pods_query($sql);
$last_id = true;
$pod_types = pods_query("SELECT `id`, `name` FROM `@wp_pod_types` ORDER BY `id`");
$types = array();
$x = 0;
if (!empty($rel) && !empty($pod_types)) {
foreach ($pod_types as $type) {
$type->name = pods_clean_name($type->name);
$types[$type->id] = $this->api->load_pod(array('name' => $type->name), false);
if (empty($types[$type->id])) {
return pods_error(sprintf(__('Pod <strong>%s</strong> not found, relationships cannot be migrated', 'pods'), $type->name));
}
$pod_fields = pods_query("SELECT `id`, `name` FROM `@wp_pod_fields` WHERE `datatype` = {$type->id} ORDER BY `id`");
$types[$type->id]['old_fields'] = array();
foreach ($pod_fields as $field) {
// Handle name changes
if (in_array($field->name, array('created', 'modified', 'author'))) {
$field->name .= '2';
}
$types[$type->id]['old_fields'][$field->id] = $field->name;
}
}
foreach ($rel as $r) {
$r->pod_id = (int) $r->pod_id;
if (!isset($types[$r->datatype]) || !isset($types[$r->datatype]['old_fields'][$r->field_id])) {
continue;
}
if (!isset($types[$r->datatype]['fields'][$types[$r->datatype]['old_fields'][$r->field_id]])) {
continue;
}
$field = $types[$r->datatype]['fields'][$types[$r->datatype]['old_fields'][$r->field_id]];
if (!in_array($field['type'], array('pick', 'file'))) {
continue;
}
$pod_id = $types[$r->datatype]['id'];
$field_id = $field['id'];
$item_id = $r->real_id;
$related_pod_id = 0;
$related_field_id = 0;
$related_item_id = $r->tbl_row_id;
if ('pick' == $field['type']) {
$old_sister_id = (int) pods_var('_pods_1x_sister_id', $field['options'], 0);
if (0 < $old_sister_id) {
$sql = "\n SELECT `f`.`id`, `f`.`name`, `t`.`name` AS `pod`\n FROM `@wp_pod_fields` AS `f`\n LEFT JOIN `@wp_pod_types` AS `t` ON `t`.`id` = `f`.`datatype`\n WHERE `f`.`id` = " . $old_sister_id . " AND `t`.`id` IS NOT NULL\n ORDER BY `f`.`id`\n LIMIT 1\n ";
$old_field = pods_query($sql);
if (empty($old_field)) {
continue;
}
$old_field = $old_field[0];
$related_field = $this->api->load_field(array('name' => $old_field->name, 'pod' => $old_field->pod));
if (empty($related_field)) {
continue;
}
$related_pod_id = $related_field['pod_id'];
$related_field_id = $related_field['id'];
} elseif ('pod' == $field['pick_object'] && 0 < strlen($field['pick_val'])) {
$related_pod = $this->api->load_pod(array('name' => $field['pick_val']), false);
if (empty($related_pod)) {
continue;
}
$related_pod_id = $related_pod['id'];
}
}
$r->id = (int) $r->id;
$pod_id = (int) $pod_id;
$field_id = (int) $field_id;
$item_id = (int) $item_id;
$related_pod_id = (int) $related_pod_id;
$related_field_id = (int) $related_field_id;
$related_item_id = (int) $related_item_id;
$r->weight = (int) $r->weight;
$table_data = array('id' => $r->id, 'pod_id' => $pod_id, 'field_id' => $field_id, 'item_id' => $item_id, 'related_pod_id' => $related_pod_id, 'related_field_id' => $related_field_id, 'related_item_id' => $related_item_id, 'weight' => $r->weight);
$table_formats = array_fill(0, count($table_data), '%d');
$sql = PodsData::insert_on_duplicate("@wp_podsrel", $table_data, $table_formats);
pods_query($sql);
$last_id = $r->id;
$x++;
if (10 < $x) {
$this->update_progress(__FUNCTION__, $last_id);
$x = 0;
}
}
}
$this->update_progress(__FUNCTION__, $last_id);
if ($migration_limit == count($rel)) {
return '-2';
} else {
return '1';
}
}