function getInvalidationData($nodes) { $this->load(); $opts = array('inheritParent' => false, 'mode' => 'all', 'fields' => array('id', 'model', 'foreign_key'), 'conditions' => array('model NOT' => null), 'order' => 'model'); $NodeLink = ClassRegistry::init('NodeLink'); $Invalidation = ClassRegistry::init('Invalidation'); /*if(!empty($this->loadedItems)){ //reset($this->loadedItems); //$minTime = current($this->loadedItems); //debug($minTime); $loadedCond = array(); foreach($this->loadedItems as $node_id => $time){ $loadedCond[] = array( $Invalidation->alias.'.node_id'=>$node_id, $Invalidation->alias.'.time >'=>$time ); } $opts = set::merge($opts,array( 'fields' => Array( "GROUP_CONCAT(IFNULL (".$Invalidation->alias.".field,'all')) AS Fields" ), 'joins' => array('1000-invalidation'=>array( 'type'=>'left', 'table'=>$Invalidation->useTable, 'alias' =>$Invalidation->alias, 'conditions' => array( $Invalidation->alias.'.node_id = AllNode.id', array('or'=>$loadedCond) ) )), 'conditions' => array( array('or'=>array( $Invalidation->alias.'.node_id IS NOT NULL', 'not'=>array('AllNode.id'=>array_keys($this->loadedItems)) )) ) )); }*/ //debug($opts); $allNodes = $NodeLink->getLinked($nodes, 'invalidation', $opts); //debug($allNodes); if (!empty($allNodes)) { /////////// Get invalidations /////////// App::import('Lib', 'SetMulti'); $allNodeId = $this->_getAllNodeIds($allNodes); $excludeCheck = array(); $invalids = array(); if (!$this->disableCache) { $excludeCheck = array_intersect_key($this->loadedItems, array_flip($allNodeId)); $bydate = SetMulti::flip($excludeCheck); //debug($bydate); $findOpt = array('fields' => array($Invalidation->alias . '.id', $Invalidation->alias . '.node_id')); foreach ($bydate as $time => $nids) { $findOpt['conditions']['or'][] = array($Invalidation->alias . '.node_id' => $nids, $Invalidation->alias . '.time >' => $time); } $invalids = $Invalidation->find('all', $findOpt); if (!empty($invalids)) { $invalids = SetMulti::group($invalids, $Invalidation->alias . '.node_id'); } } //debug($invalids); //debug($excludeCheck); /////////// remove unneeded /////////// $toGet = array(); foreach ($allNodes as $node) { $nid = $node['Node']['id']; if ((!isset($excludeCheck[$nid]) || isset($invalids[$nid])) && !empty($node['Node']['model'])) { $model = $node['Node']['model']; if (empty($toGet[$model])) { $toGet[$model] = array('ids' => array(), 'globalFields' => 'all', 'fields' => array()); } $id = $node['Node']['foreign_key']; $toGet[$model]['ids'][] = $id; $toGet[$model]['fields'][$id] = 'all'; } } //debug($toGet); $aro = array($this->controller->User->myNodeRef($this->controller->user['User']['id'])); //debug($aro); $allItems = array(); foreach ($toGet as $modelName => $opt) { $model = ClassRegistry::init($modelName); $model->create(); $findOptions = array('conditions' => array($model->alias . '.id' => $opt['ids'])); if ($opt['globalFields'] != 'all') { $findOptions['restrict'] = $opt['globalFields']; } //debug($findOptions); $items = $model->triggerAction('linkRead', array($findOptions), $aro); if (!empty($items)) { $allItems = array_merge($allItems, $items); } } //debug($allItems); return $allItems; } return null; }
function updateDataNow(&$model, $data, $time = null, $options = array()) { App::import('Lib', 'SetMulti'); if (empty($data)) { return $data; } if (is_array($time)) { $options = $time; } else { $options['time'] = $time; } $defOpt = array('time' => null, 'belongsTo' => array()); $opt = array_merge($options, $defOpt); if (empty($opt['time'])) { $opt['time'] = mktime(); } ////// Normalize Data ////// //todo : add lateral relation normalisation $model->Behaviors->attach('Util'); $oldFormat = array(); //$data = $model->unifiedResult($data, null, array(), $oldFormat); list($data, $oldFormat) = $model->unifiedResult($data, null, null, true); //debug($oldFormat); ////// get relation key fields ////// $relationKeyFields = array(); $belongsTo = array_merge($model->belongsTo, $opt['belongsTo']); foreach ($model->belongsTo as $bkey => $belongs) { if (!empty($data[0][$bkey])) { $relationKeyFields[] = $belongs['foreignKey']; } } ////// get updated Data ////// $plans = array(); $fields = array_merge(array_keys($data[0][$model->alias]), $relationKeyFields); $changes = $this->getChanges($model, $data, $opt['time'], $fields, $plans); ////// get updated relations ////// foreach ($model->belongsTo as $bkey => $belongs) { $toUpdate = array(); foreach ($changes as $rkey => $row) { if (!empty($data[$rkey][$bkey]) && !empty($row[$model->alias][$belongs['foreignKey']])) { $toUpdate[$rkey] = $row[$model->alias][$belongs['foreignKey']]; } } $mapping = SetMulti::flip($toUpdate); if (!empty($toUpdate)) { $excludeFields = array('name', 'className', 'counterCache'); $findOptions = array_diff_key($belongs, array_flip($excludeFields)); $bModel = $model->{$bkey}; $findOptions['conditions'][$bModel->alias . '.id'] = $toUpdate; $findOptions['recursive'] = -1; // in the futur we may want to detect contain option $newBinded = $bModel->find('all', $findOptions); //$newBinded = $bModel->dataToContainedRelations($new); //see comment on recursive foreach ($newBinded as $n) { $nid = $n[$bkey][$bModel->primaryKey]; foreach ((array) $mapping[$nid] as $rkey) { $changes[$rkey][$bkey] = $n[$bkey]; } } } } //debug($changes); $data = Set::merge($data, $changes); //todo : recursive relations update ////// Painless update ////// if (strtotime($opt['time']) <= mktime()) { $this->_applyPlans($model, $plans, $opt['time']); } ////// Un-normalize Data ////// $data = $model->unifiedResult($data, null, $oldFormat); return $data; }
function fix_emailDuplicate2($error, $opt, &$msg) { $_this =& NewsletterUpgrade::getInstance(); $db = ConnectionManager::getDataSource($_this->connection); App::import('Lib', 'Newsletter.SetMulti'); $this->NewsletterEmail = ClassRegistry::init('Newsletter.NewsletterEmail'); $this->NewsletterSendlistsEmail = ClassRegistry::init('Newsletter.NewsletterSendlistsEmail'); $findOpt = array('fields' => array('e2.id', 'NewsletterEmail.id'), 'conditions' => array(), 'joins' => array(array('alias' => 'e2', 'table' => $this->NewsletterEmail->useTable, 'type' => 'INNER', 'conditions' => array('`e2`.`id` != `NewsletterEmail`.`id`', '`e2`.`email` = `NewsletterEmail`.`email`'))), 'group' => '`e2`.`id` HAVING `e2`.`id` > `NewsletterEmail`.`id`', 'recursive' => -1, 'model' => $this->NewsletterEmail); $duplicated = SetMulti::flip($this->NewsletterEmail->find('list', $findOpt)); foreach ($duplicated as $first => $dup) { $dup = (array) $dup; $query = 'UPDATE `newsletter_sendlists_emails` AS `NewsletterSendlistsEmail` LEFT JOIN `newsletter_sendlists_emails` AS `Equiv` ON (`NewsletterSendlistsEmail`.`newsletter_sendlist_id` = `Equiv`.`newsletter_sendlist_id` AND `Equiv`.`newsletter_email_id` = ' . $first . ') SET `NewsletterSendlistsEmail`.`newsletter_email_id` = ' . $first . ' WHERE `Equiv`.`id` IS NULL AND `NewsletterSendlistsEmail`.`newsletter_email_id` IN (' . implode(', ', $dup) . ')'; if (!$db->execute($query)) { $msg = __('Unable to execute query :', true) . ' ' . $query; return false; } $this->NewsletterSendlistsEmail->deleteAll(array('newsletter_email_id' => array_values($dup))); $this->NewsletterEmail->deleteAll(array('id' => array_values($dup))); } $query = $db->alterSchema($error, 'newsletter_emails'); if (!$db->execute($query)) { $msg[] = __('Unable to execute query :', true) . ' ' . $query; return false; break; } return true; }