/**
  * A "real-life" test of the deduplicateConversions() method.
  *
  * - Tracker ID 1 tracks two variables, on non-unique, and one unique.
  * - Tracker ID 2 tracks one variable, which is unique.
  *
  * Between 12:00 and 13:00:
  * - One conversion for Tracker ID 1.
  * - One conversion for Tracker ID 2.
  * - Obviously, de-duplication is tested to ensure that both conversions
  *   remain as "approved".
  *
  * Between 13:00 and 14:00
  * - One conversion for Tracker ID 1, where the conversion is within
  *   the de-duplication window, but the variable value is not the
  *   same as for the conversion in the previous hour.
  * - Another conversion for Tracker ID 1, where the conversion is
  *   again within the de-duplication window, but this time, the
  *   variable value is the same as the conversion in the previous
  *   hour.
  * - De-duplication is tested to ensure that the first of the above
  *   conversions remains as "approved", while the second is changed
  *   to "duplicate".
  *
  * Between 14:00 and 15:00
  * - One conversion for Tracker ID 1, with a non-unique logged variable
  *   value, where the conversion is not within the de-duplication
  *   window of the original "approved" conversion, but is within the
  *   conversion window of a previously marked "duplicate" conversion.
  * - One conversion for Tracker ID 2, with a non-unique logged variable
  *   value, where the conversion is not within the de-duplication window.
  * - De-duplication is tested to ensure that the conversion where a
  *   duplicate conversion was located is also marked as "duplicate",
  *   while the other conversion with no matching conversions in the
  *   required de-duplication window does not have its "approved" status
  *   changed.
  */
 function testDeduplicateConversions_33()
 {
     // Prepare the non-unique variable value that should
     // be tracked with Tracker ID 1
     $aData = array('trackerid' => 1, 'name' => 'Tracker ID 1 Non-Unique Variable', 'is_unique' => 0, 'unique_window' => 3600);
     $trackerVariableId1 = $this->_insertVariable($aData);
     // Prepare the unique variable value that should
     // be tracked with Tracker ID 1
     $aData = array('trackerid' => 1, 'name' => 'Tracker ID 1 Unique Variable', 'is_unique' => 1, 'unique_window' => 3600);
     $trackerVariableId2 = $this->_insertVariable($aData);
     // Prepare the unique variable value that should
     // be tracked with tracker ID 2
     $aData = array('trackerid' => 2, 'name' => 'Trackers ID 2 Unique Variable', 'is_unique' => 1, 'unique_window' => 3600);
     $trackerVariableId3 = $this->_insertVariable($aData);
     /******************************************************************/
     // Insert a connection at 12:10:00, from a click on ad ID 5, zone ID 6, at 12:09,
     // using Tracker ID 1
     $aData = array('server_raw_tracker_impression_id' => 1, 'server_raw_ip' => 'singleDB', 'tracker_id' => 1, 'tracker_date_time' => '2005-09-05 12:10:00', 'connection_date_time' => '2005-09-05 12:09:00', 'ad_id' => 5, 'zone_id' => 6, 'connection_action' => MAX_CONNECTION_AD_CLICK, 'connection_window' => 1209600, 'connection_status' => MAX_CONNECTION_STATUS_APPROVED);
     $conversionId1 = $this->_insertDataIntermediateAdConnection($aData);
     // Insert the variable values for the conversion
     $aData = array('data_intermediate_ad_connection_id' => $conversionId1, 'tracker_variable_id' => $trackerVariableId1, 'value' => 'non-unique tracked value');
     $this->_insertDataIntermediateAdVariableValue($aData);
     $aData = array('data_intermediate_ad_connection_id' => $conversionId1, 'tracker_variable_id' => $trackerVariableId2, 'value' => 'unique tracked value');
     $this->_insertDataIntermediateAdVariableValue($aData);
     // Insert a connection at 12:15:00, from a click on ad ID 7, zone ID 8, at 12:14,
     // using Tracker ID 2
     $aData = array('server_raw_tracker_impression_id' => 2, 'server_raw_ip' => 'singleDB', 'tracker_id' => 2, 'tracker_date_time' => '2005-09-05 12:15:00', 'connection_date_time' => '2005-09-05 12:14:00', 'ad_id' => 7, 'zone_id' => 8, 'connection_action' => MAX_CONNECTION_AD_CLICK, 'connection_window' => 1209600, 'connection_status' => MAX_CONNECTION_STATUS_APPROVED);
     $conversionId2 = $this->_insertDataIntermediateAdConnection($aData);
     // Insert the variable value for the conversion
     $aData = array('data_intermediate_ad_connection_id' => $conversionId2, 'tracker_variable_id' => $trackerVariableId3, 'value' => 'unique tracked value');
     $this->_insertDataIntermediateAdVariableValue($aData);
     // De-duplicate the 12:00 - 13:00 hour
     $oStartDate = new Date('2005-09-05 12:00:00');
     $oEndDate = new Date('2005-09-07 12:59:59');
     $this->oDal->deduplicateConversions($oStartDate, $oEndDate);
     // Test the results
     $rows = $this->_countDataIntermediateAdConnections();
     $this->assertEqual($rows, 2);
     $rows = $this->_countDataIntermediateAdConnectionsApproved();
     $this->assertEqual($rows, 2);
     /******************************************************************/
     // Insert a connection at 13:05:00, from a click on ad ID 5, zone ID 6, at 13:04,
     // using Tracker ID 1
     $aData = array('server_raw_tracker_impression_id' => 3, 'server_raw_ip' => 'singleDB', 'tracker_id' => 1, 'tracker_date_time' => '2005-09-05 13:05:00', 'connection_date_time' => '2005-09-05 13:04:00', 'ad_id' => 5, 'zone_id' => 6, 'connection_action' => MAX_CONNECTION_AD_CLICK, 'connection_window' => 1209600, 'connection_status' => MAX_CONNECTION_STATUS_APPROVED);
     $conversionId3 = $this->_insertDataIntermediateAdConnection($aData);
     // Insert the variable values for the conversion
     $aData = array('data_intermediate_ad_connection_id' => $conversionId3, 'tracker_variable_id' => $trackerVariableId1, 'value' => 'non-unique tracked value');
     $this->_insertDataIntermediateAdVariableValue($aData);
     $aData = array('data_intermediate_ad_connection_id' => $conversionId3, 'tracker_variable_id' => $trackerVariableId2, 'value' => 'unique tracked value, but a different one :-)');
     $this->_insertDataIntermediateAdVariableValue($aData);
     // Insert a connection at 13:06:00, from a click on ad ID 5, zone ID 6, at 13:05,
     // using Tracker ID 1
     $aData = array('server_raw_tracker_impression_id' => 4, 'server_raw_ip' => 'singleDB', 'tracker_id' => 1, 'tracker_date_time' => '2005-09-05 13:06:00', 'connection_date_time' => '2005-09-05 13:05:00', 'ad_id' => 5, 'zone_id' => 6, 'connection_action' => MAX_CONNECTION_AD_CLICK, 'connection_window' => 1209600, 'connection_status' => MAX_CONNECTION_STATUS_APPROVED);
     $conversionId4 = $this->_insertDataIntermediateAdConnection($aData);
     // Insert the variable values for the conversion
     $aData = array('data_intermediate_ad_connection_id' => $conversionId4, 'tracker_variable_id' => $trackerVariableId1, 'value' => 'non-unique tracked value');
     $this->_insertDataIntermediateAdVariableValue($aData);
     $aData = array('data_intermediate_ad_connection_id' => $conversionId4, 'tracker_variable_id' => $trackerVariableId2, 'value' => 'unique tracked value');
     $this->_insertDataIntermediateAdVariableValue($aData);
     // De-duplicate the 13:00 - 14:00 hour
     $oStartDate = new Date('2005-09-05 13:00:00');
     $oEndDate = new Date('2005-09-07 13:59:59');
     $this->oDal->deduplicateConversions($oStartDate, $oEndDate);
     // Test the results
     $rows = $this->_countDataIntermediateAdConnections();
     $this->assertEqual($rows, 4);
     $rows = $this->_countDataIntermediateAdConnectionsApproved();
     $this->assertEqual($rows, 3);
     $doData_intermediate_ad_connection = OA_Dal::factoryDO('data_intermediate_ad_connection');
     $doData_intermediate_ad_connection->data_intermediate_ad_connection_id = $conversionId1;
     $doData_intermediate_ad_connection->find();
     $doData_intermediate_ad_connection->fetch();
     $this->assertEqual($doData_intermediate_ad_connection->connection_status, MAX_CONNECTION_STATUS_APPROVED);
     $doData_intermediate_ad_connection = OA_Dal::factoryDO('data_intermediate_ad_connection');
     $doData_intermediate_ad_connection->data_intermediate_ad_connection_id = $conversionId2;
     $doData_intermediate_ad_connection->find();
     $doData_intermediate_ad_connection->fetch();
     $this->assertEqual($doData_intermediate_ad_connection->connection_status, MAX_CONNECTION_STATUS_APPROVED);
     $doData_intermediate_ad_connection = OA_Dal::factoryDO('data_intermediate_ad_connection');
     $doData_intermediate_ad_connection->data_intermediate_ad_connection_id = $conversionId3;
     $doData_intermediate_ad_connection->find();
     $doData_intermediate_ad_connection->fetch();
     $this->assertEqual($doData_intermediate_ad_connection->connection_status, MAX_CONNECTION_STATUS_APPROVED);
     $rows = $this->_countDataIntermediateAdConnectionsDuplicate();
     $this->assertEqual($rows, 1);
     $doData_intermediate_ad_connection = OA_Dal::factoryDO('data_intermediate_ad_connection');
     $doData_intermediate_ad_connection->data_intermediate_ad_connection_id = $conversionId4;
     $doData_intermediate_ad_connection->find();
     $doData_intermediate_ad_connection->fetch();
     $this->assertEqual($doData_intermediate_ad_connection->connection_status, MAX_CONNECTION_STATUS_DUPLICATE);
     /******************************************************************/
     // Insert a connection at 14:02:00, from a click on ad ID 5, zone ID 6, at 14:01,
     // using Tracker ID 1
     $aData = array('server_raw_tracker_impression_id' => 5, 'server_raw_ip' => 'singleDB', 'tracker_id' => 1, 'tracker_date_time' => '2005-09-05 14:02:00', 'connection_date_time' => '2005-09-05 14:01:00', 'ad_id' => 5, 'zone_id' => 6, 'connection_action' => MAX_CONNECTION_AD_CLICK, 'connection_window' => 1209600, 'connection_status' => MAX_CONNECTION_STATUS_APPROVED);
     $conversionId5 = $this->_insertDataIntermediateAdConnection($aData);
     // Insert the variable values for the conversion
     $aData = array('data_intermediate_ad_connection_id' => $conversionId5, 'tracker_variable_id' => $trackerVariableId1, 'value' => 'non-unique tracked value');
     $this->_insertDataIntermediateAdVariableValue($aData);
     $aData = array('data_intermediate_ad_connection_id' => $conversionId5, 'tracker_variable_id' => $trackerVariableId2, 'value' => 'unique tracked value');
     $this->_insertDataIntermediateAdVariableValue($aData);
     // Insert a connection at 14:15:00, from a click on ad ID 7, zone ID 8, at 14:14,
     // using Tracker ID 2
     $aData = array('server_raw_tracker_impression_id' => 6, 'server_raw_ip' => 'singleDB', 'tracker_id' => 2, 'tracker_date_time' => '2005-09-05 14:15:00', 'connection_date_time' => '2005-09-05 14:14:00', 'ad_id' => 7, 'zone_id' => 8, 'connection_action' => MAX_CONNECTION_AD_CLICK, 'connection_window' => 1209600, 'connection_status' => MAX_CONNECTION_STATUS_APPROVED);
     $conversionId6 = $this->_insertDataIntermediateAdConnection($aData);
     // Insert the variable value for the conversion
     $aData = array('data_intermediate_ad_connection_id' => $conversionId6, 'tracker_variable_id' => $trackerVariableId3, 'value' => 'unique tracked value');
     $this->_insertDataIntermediateAdVariableValue($aData);
     // De-duplicate the 14:00 - 15:00 hour
     $oStartDate = new Date('2005-09-05 14:00:00');
     $oEndDate = new Date('2005-09-07 14:59:59');
     $this->oDal->deduplicateConversions($oStartDate, $oEndDate);
     // Test the results
     $rows = $this->_countDataIntermediateAdConnections();
     $this->assertEqual($rows, 6);
     $rows = $this->_countDataIntermediateAdConnectionsApproved();
     $this->assertEqual($rows, 4);
     $doData_intermediate_ad_connection = OA_Dal::factoryDO('data_intermediate_ad_connection');
     $doData_intermediate_ad_connection->data_intermediate_ad_connection_id = $conversionId1;
     $doData_intermediate_ad_connection->find();
     $doData_intermediate_ad_connection->fetch();
     $this->assertEqual($doData_intermediate_ad_connection->connection_status, MAX_CONNECTION_STATUS_APPROVED);
     $doData_intermediate_ad_connection = OA_Dal::factoryDO('data_intermediate_ad_connection');
     $doData_intermediate_ad_connection->data_intermediate_ad_connection_id = $conversionId2;
     $doData_intermediate_ad_connection->find();
     $doData_intermediate_ad_connection->fetch();
     $this->assertEqual($doData_intermediate_ad_connection->connection_status, MAX_CONNECTION_STATUS_APPROVED);
     $doData_intermediate_ad_connection = OA_Dal::factoryDO('data_intermediate_ad_connection');
     $doData_intermediate_ad_connection->data_intermediate_ad_connection_id = $conversionId3;
     $doData_intermediate_ad_connection->find();
     $doData_intermediate_ad_connection->fetch();
     $this->assertEqual($doData_intermediate_ad_connection->connection_status, MAX_CONNECTION_STATUS_APPROVED);
     $doData_intermediate_ad_connection = OA_Dal::factoryDO('data_intermediate_ad_connection');
     $doData_intermediate_ad_connection->data_intermediate_ad_connection_id = $conversionId6;
     $doData_intermediate_ad_connection->find();
     $doData_intermediate_ad_connection->fetch();
     $this->assertEqual($doData_intermediate_ad_connection->connection_status, MAX_CONNECTION_STATUS_APPROVED);
     $rows = $this->_countDataIntermediateAdConnectionsDuplicate();
     $this->assertEqual($rows, 2);
     $doData_intermediate_ad_connection = OA_Dal::factoryDO('data_intermediate_ad_connection');
     $doData_intermediate_ad_connection->data_intermediate_ad_connection_id = $conversionId4;
     $doData_intermediate_ad_connection->find();
     $doData_intermediate_ad_connection->fetch();
     $this->assertEqual($doData_intermediate_ad_connection->connection_status, MAX_CONNECTION_STATUS_DUPLICATE);
     $doData_intermediate_ad_connection = OA_Dal::factoryDO('data_intermediate_ad_connection');
     $doData_intermediate_ad_connection->data_intermediate_ad_connection_id = $conversionId5;
     $doData_intermediate_ad_connection->find();
     $doData_intermediate_ad_connection->fetch();
     $this->assertEqual($doData_intermediate_ad_connection->connection_status, MAX_CONNECTION_STATUS_DUPLICATE);
     // Clean up
     DataGenerator::cleanUp();
 }