/** * A method to test when there are no old format raw requests, * impressions and clicks. */ function testNoData() { $aConf =& $GLOBALS['_MAX']['CONF']; $aConf['maintenance']['operationInterval'] = 60; // Prepare an array of the required tables used in testing $aTables = array($aConf['table']['prefix'] . $aConf['table']['data_raw_ad_request'] => $aConf['table']['prefix'] . 'data_bkt_r', $aConf['table']['prefix'] . $aConf['table']['data_raw_ad_impression'] => $aConf['table']['prefix'] . 'data_bkt_m', $aConf['table']['prefix'] . $aConf['table']['data_raw_ad_click'] => $aConf['table']['prefix'] . 'data_bkt_c'); // Install the openXDeliveryLog plugin, which will create the // data bucket tables required for testing TestEnv::installPluginPackage('openXDeliveryLog', false); // Ensure that there are no old format raw data foreach ($aTables as $rawTable => $bucketTable) { $query = "\n SELECT\n COUNT(*) AS count\n FROM\n " . $this->oDbh->quoteIdentifier($rawTable, true); $rsResult = $this->oDbh->query($query); $this->assertNotA($rsReults, 'PEAR_Error'); $rows = $rsResult->numRows(); $this->assertEqual($rows, 1); $aRow = $rsResult->fetchRow(); $this->assertEqual($aRow['count'], 0); } // Ensure that there are no new format bucket data foreach ($aTables as $rawTable => $bucketTable) { $query = "\n SELECT\n COUNT(*) AS count\n FROM\n " . $this->oDbh->quoteIdentifier($bucketTable, true); $rsResult = $this->oDbh->query($query); $this->assertNotA($rsReults, 'PEAR_Error'); $rows = $rsResult->numRows(); $this->assertEqual($rows, 1); $aRow = $rsResult->fetchRow(); $this->assertEqual($aRow['count'], 0); } // Run the migration of raw data DAL code for a given OI $oStart = new Date('2009-01-09 12:00:00'); $oEnd = new Date('2009-01-09 12:59:59'); $this->oDal->migrateRawRequests($oStart, $oEnd); $this->oDal->migrateRawImpressions($oStart, $oEnd); $this->oDal->migrateRawClicks($oStart, $oEnd); // Re-test that there are still no new format bucket data foreach ($aTables as $rawTable => $bucketTable) { $query = "\n SELECT\n COUNT(*) AS count\n FROM\n " . $this->oDbh->quoteIdentifier($bucketTable, true); $rsResult = $this->oDbh->query($query); $this->assertNotA($rsReults, 'PEAR_Error'); $rows = $rsResult->numRows(); $this->assertEqual($rows, 1); $aRow = $rsResult->fetchRow(); $this->assertEqual($aRow['count'], 0); } // Uninstall the installed plugin TestEnv::uninstallPluginPackage('openXDeliveryLog', false); // Restore the test environment configuration TestEnv::restoreConfig(); }
/** * A method to migrate any old style raw clicks into new style, bucket-based * clicks, in the event of the requirement to process any such data on upgrade * to (or beyond) OpenX 2.8. * * @param PEAR::Date $oStart The start date of the operation interval to migrate. * @param PEAR::Date $oEnd The end date of the operation interval to migrate. */ function migrateRawClicks($oStart, $oEnd) { // Set the MySQL sort buffer size $this->setSortBufferSize(); // Perform the default action for migration of raw clicks... parent::migrateRawClicks($oStart, $oEnd); // Restore the MySQL sort buffer size $this->restoreSortBufferSize(); }
/** * The constuctor method. * * @return OX_Dal_Maintenance_Statistics_Pgsql */ function __construct() { $this->timestampCastString = '::timestamp'; parent::__construct(); }
/** * A method to test when there are old format raw requests, * impressions and clicks, in the operation interval being * migrated. */ function testComplexValidData() { $aConf =& $GLOBALS['_MAX']['CONF']; $aConf['maintenance']['operationInterval'] = 60; // Prepare an array of the required tables used in testing $aTables = array($aConf['table']['prefix'] . $aConf['table']['data_raw_ad_request'] => $aConf['table']['prefix'] . 'data_bkt_r', $aConf['table']['prefix'] . $aConf['table']['data_raw_ad_impression'] => $aConf['table']['prefix'] . 'data_bkt_m', $aConf['table']['prefix'] . $aConf['table']['data_raw_ad_click'] => $aConf['table']['prefix'] . 'data_bkt_c'); // Install the openXDeliveryLog plugin, which will create the // data bucket tables required for testing TestEnv::installPluginPackage('openXDeliveryLog', false); // Ensure that there are no old format raw data foreach ($aTables as $rawTable => $bucketTable) { $query = "\n SELECT\n COUNT(*) AS count\n FROM\n " . $this->oDbh->quoteIdentifier($rawTable, true); $rsResult = $this->oDbh->query($query); $this->assertNotA($rsReults, 'PEAR_Error'); $rows = $rsResult->numRows(); $this->assertEqual($rows, 1); $aRow = $rsResult->fetchRow(); $this->assertEqual($aRow['count'], 0); } // Ensure that there are no new format bucket data foreach ($aTables as $rawTable => $bucketTable) { $query = "\n SELECT\n COUNT(*) AS count\n FROM\n " . $this->oDbh->quoteIdentifier($bucketTable, true); $rsResult = $this->oDbh->query($query); $this->assertNotA($rsReults, 'PEAR_Error'); $rows = $rsResult->numRows(); $this->assertEqual($rows, 1); $aRow = $rsResult->fetchRow(); $this->assertEqual($aRow['count'], 0); } // Insert some old style raw data in an operation interval // that will not be migrated foreach ($aTables as $rawTable => $bucketTable) { $query = "\n INSERT INTO\n " . $this->oDbh->quoteIdentifier($rawTable, true) . "\n (\n date_time,\n ad_id,\n creative_id,\n zone_id\n )\n VALUES\n (\n '2009-01-09 11:30:00',\n 1,\n 0,\n 1\n )"; $this->oDbh->exec($query); } // Ensure that the old format raw data was inserted correctly foreach ($aTables as $rawTable => $bucketTable) { $query = "\n SELECT\n COUNT(*) AS count\n FROM\n " . $this->oDbh->quoteIdentifier($rawTable, true); $rsResult = $this->oDbh->query($query); $this->assertNotA($rsReults, 'PEAR_Error'); $rows = $rsResult->numRows(); $this->assertEqual($rows, 1); $aRow = $rsResult->fetchRow(); $this->assertEqual($aRow['count'], 1); } // Insert some old style raw data in an operation interval // that will be migrated foreach ($aTables as $rawTable => $bucketTable) { $query = "\n INSERT INTO\n " . $this->oDbh->quoteIdentifier($rawTable, true) . "\n (\n date_time,\n ad_id,\n creative_id,\n zone_id\n )\n VALUES\n (\n '2009-01-09 12:30:00',\n 1,\n 0,\n 1\n )"; $this->oDbh->exec($query); $query = "\n INSERT INTO\n " . $this->oDbh->quoteIdentifier($rawTable, true) . "\n (\n date_time,\n ad_id,\n creative_id,\n zone_id\n )\n VALUES\n (\n '2009-01-09 12:31:00',\n 1,\n 0,\n 1\n )"; $this->oDbh->exec($query); $query = "\n INSERT INTO\n " . $this->oDbh->quoteIdentifier($rawTable, true) . "\n (\n date_time,\n ad_id,\n creative_id,\n zone_id\n )\n VALUES\n (\n '2009-01-09 12:32:00',\n 2,\n 0,\n 3\n )"; $this->oDbh->exec($query); } // Ensure that the old format raw data was inserted correctly foreach ($aTables as $rawTable => $bucketTable) { $query = "\n SELECT\n COUNT(*) AS count\n FROM\n " . $this->oDbh->quoteIdentifier($rawTable, true); $rsResult = $this->oDbh->query($query); $this->assertNotA($rsReults, 'PEAR_Error'); $rows = $rsResult->numRows(); $this->assertEqual($rows, 1); $aRow = $rsResult->fetchRow(); $this->assertEqual($aRow['count'], 4); } // Run the migration of raw data DAL code for a given OI $oStart = new Date('2009-01-09 12:00:00'); $oEnd = new Date('2009-01-09 12:59:59'); $this->oDal->migrateRawRequests($oStart, $oEnd); $this->oDal->migrateRawImpressions($oStart, $oEnd); $this->oDal->migrateRawClicks($oStart, $oEnd); // Test that the data was migrated correctly foreach ($aTables as $rawTable => $bucketTable) { $query = "\n SELECT\n COUNT(*) AS count\n FROM\n " . $this->oDbh->quoteIdentifier($bucketTable, true); $rsResult = $this->oDbh->query($query); $this->assertNotA($rsReults, 'PEAR_Error'); $rows = $rsResult->numRows(); $this->assertEqual($rows, 1); $aRow = $rsResult->fetchRow(); $this->assertEqual($aRow['count'], 2); $query = "\n SELECT\n *\n FROM\n " . $this->oDbh->quoteIdentifier($bucketTable, true); $rsResult = $this->oDbh->query($query); $this->assertNotA($rsReults, 'PEAR_Error'); $rows = $rsResult->numRows(); $this->assertEqual($rows, 2); $query = "\n SELECT\n *\n FROM\n " . $this->oDbh->quoteIdentifier($bucketTable, true) . "\n WHERE\n creative_id = 1"; $rsResult = $this->oDbh->query($query); $this->assertNotA($rsReults, 'PEAR_Error'); $rows = $rsResult->numRows(); $this->assertEqual($rows, 1); $aRow = $rsResult->fetchRow(); $this->assertEqual($aRow['interval_start'], '2009-01-09 12:00:00'); $this->assertEqual($aRow['creative_id'], 1); $this->assertEqual($aRow['zone_id'], 1); $this->assertEqual($aRow['count'], 2); $query = "\n SELECT\n *\n FROM\n " . $this->oDbh->quoteIdentifier($bucketTable, true) . "\n WHERE\n creative_id = 2"; $rsResult = $this->oDbh->query($query); $this->assertNotA($rsReults, 'PEAR_Error'); $rows = $rsResult->numRows(); $this->assertEqual($rows, 1); $aRow = $rsResult->fetchRow(); $this->assertEqual($aRow['interval_start'], '2009-01-09 12:00:00'); $this->assertEqual($aRow['creative_id'], 2); $this->assertEqual($aRow['zone_id'], 3); $this->assertEqual($aRow['count'], 1); } // Uninstall the installed plugin TestEnv::uninstallPluginPackage('openXDeliveryLog', false); // Restore the test environment configuration TestEnv::restoreConfig(); }
/** * 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(); }
/** * The constuctor method. * * @return OX_Dal_Maintenance_Statistics_Pgsql */ function OX_Dal_Maintenance_Statistics_Pgsql() { $this->timestampCastString = '::timestamp'; parent::OX_Dal_Maintenance_Statistics(); }