/**
  * For a given partialName, run search by partial name and retrieve account models.
  * @param string $partialName
  * @param null|int $pageSize
  */
 public static function getAccountsByPartialName($partialName, $pageSize = null)
 {
     assert('is_string($partialName)');
     $metadata = array();
     $metadata['clauses'] = array(1 => array('attributeName' => 'name', 'operatorType' => 'contains', 'value' => $partialName));
     $metadata['structure'] = '1';
     $joinTablesAdapter = new RedBeanModelJoinTablesQueryAdapter('Account');
     $where = RedBeanModelDataProvider::makeWhere('Account', $metadata, $joinTablesAdapter);
     return Account::getSubset($joinTablesAdapter, null, $pageSize, $where);
 }
Beispiel #2
0
 /**
  * For a given email address, run search by email address and retrieve account models.
  */
 public static function getAccountsByAnyEmailAddress($emailAddress, $pageSize = null)
 {
     assert('is_string($emailAddress)');
     $metadata = array();
     $metadata['clauses'] = array(1 => array('attributeName' => 'primaryEmail', 'relatedAttributeName' => 'emailAddress', 'operatorType' => 'equals', 'value' => $emailAddress), 2 => array('attributeName' => 'secondaryEmail', 'relatedAttributeName' => 'emailAddress', 'operatorType' => 'equals', 'value' => $emailAddress));
     $metadata['structure'] = '(1 or 2)';
     $joinTablesAdapter = new RedBeanModelJoinTablesQueryAdapter('Account');
     $where = RedBeanModelDataProvider::makeWhere('Account', $metadata, $joinTablesAdapter);
     return Account::getSubset($joinTablesAdapter, null, $pageSize, $where);
 }
 protected function nukeExistingAccounts()
 {
     while (true) {
         $accounts = Account::getSubset(null, 0, 50);
         // Nuke 50 at a time to
         if (count($accounts) == 0) {
             // we get to the big numbers.
             break;
         }
         foreach ($accounts as $account) {
             $account->delete();
             unset($account);
         }
         unset($accounts);
     }
     $this->assertEquals(0, Account::getCount());
 }
 public function disabled_testAShootLoadOfAccounts()
 {
     $super = User::getByUsername('super');
     foreach (array(20, 50, 100, 200, 500, 1000, 10000, 100000, 200000) as $shootLoad) {
         echo "\nNuking existing accounts...\n";
         Yii::app()->user->userModel = $super;
         $this->nukeExistingAccounts();
         echo "Creating {$shootLoad} accounts...\n";
         echo " - Giving every 10th to Betty, giving Benny read\n";
         echo "   on overy 8th, and giving Sales Staff read on\n";
         echo "   every 12th.\n";
         list($time, $countThatBennyCanRead, $accountIdsThatBennyCanRead) = $this->createAccounts($shootLoad);
         echo 'Created accounts in ' . round($time, 1) . " seconds.\n";
         echo "Benny can read {$countThatBennyCanRead} of them.\n";
         echo 'The first few... ';
         for ($i = 0; $i < 10 && $i < count($accountIdsThatBennyCanRead); $i++) {
             echo "{$accountIdsThatBennyCanRead[$i]}|";
         }
         echo "\n";
         $startTime = microtime(true);
         ReadPermissionsOptimizationUtil::rebuild(true, true);
         $endTime = microtime(true);
         if ($this->isDebug()) {
             echo 'Rebuilt the munge in php in ' . round($endTime - $startTime, 1) . ' seconds, ' . self::getAccountMungeRowCount() . " rows.\n";
         }
         $phpRows = ZurmoRedBean::getAll('select munge_id, securableitem_id, count from account_read order by munge_id, securableitem_id, count');
         // If $securityOptimized is false in debug.php the second one will just do the php again.
         $startTime = microtime(true);
         ReadPermissionsOptimizationUtil::rebuild();
         $endTime = microtime(true);
         if ($this->isDebug()) {
             echo 'Rebuilt the munge ' . (SECURITY_OPTIMIZED ? 'optimized' : 'in php') . ' in ' . round($endTime - $startTime, 1) . ' seconds, ' . self::getAccountMungeRowCount() . " rows.\n";
         }
         $otherRows = ZurmoRedBean::getAll('select munge_id, securableitem_id, count from account_read order by munge_id, securableitem_id, count');
         if (count(array_diff($phpRows, $otherRows)) > 0) {
             echo "PHP & optimized munges don't match.\n";
             echo "--------\n";
             foreach ($phpRows as $row) {
                 echo join(', ', array_values($row)) . "\n";
             }
             echo "--------\n";
             foreach ($otherRows as $row) {
                 echo join(', ', array_values($row)) . "\n";
             }
             echo "--------\n";
         }
         $this->assertEquals(count($phpRows), count($otherRows));
         $this->assertEquals($phpRows, $otherRows);
         Yii::app()->user->userModel = User::getByUsername('benny');
         $count = Account::getCount();
         $startTime = microtime(true);
         $accounts = Account::getSubset(null, 0, 20);
         $endTime = microtime(true);
         echo 'As Benny retrieved 1 - ' . count($accounts) . " of {$count} in " . round($endTime - $startTime, 2) . " seconds.\n";
         unset($accounts);
         $offset = intval($count * 0.75);
         $startTime = microtime(true);
         $accounts = Account::getSubset(null, $offset, 20);
         $endTime = microtime(true);
         echo "As Benny retrieved {$offset} - " . ($offset + count($accounts)) . " of {$count} in " . round($endTime - $startTime, 3) . " seconds.\n";
         unset($accounts);
         echo "Done.\n";
         echo "\n-------------------------------\n";
     }
 }
 /**
  * @depends testAllNullValuedCustomAttributesAdaptToMetadataFromPostCorrectly
  */
 public function testAllCustomAttributesAdaptToMetadataFromPostCorrectly()
 {
     $super = User::getByUsername('super');
     Yii::app()->user->userModel = $super;
     //Account Model - Fake post with all custom attribute types that they adapt correct to metadata.
     $fakePostData = array('checkBoxCstm' => array('value' => '1'), 'currencyCstm' => '108.45', 'dateCstm' => '2007-07-01', 'dateTimeCstm' => '2007-07-01 06:12:45', 'decimalCstm' => '45.6', 'dropDownCstm' => array('value' => '3'), 'integerCstm' => '67876', 'phoneCstm' => '123456', 'radioCstm' => array('value' => '2'), 'textCstm' => 'Some Text', 'textAreaCstm' => 'Some description', 'urlCstm' => 'somesite.com');
     $metadataAdapter = new SearchDataProviderMetadataAdapter(new Account(), $super->id, $fakePostData);
     $searchAttributeData = $metadataAdapter->getAdaptedMetadata();
     $compareClauses = array(1 => array('attributeName' => 'checkBoxCstm', 'operatorType' => 'equals', 'value' => (bool) 1), 2 => array('attributeName' => 'currencyCstm', 'operatorType' => 'equals', 'value' => (double) 108.45), 3 => array('attributeName' => 'dateCstm', 'operatorType' => 'equals', 'value' => '2007-07-01'), 4 => array('attributeName' => 'dateTimeCstm', 'operatorType' => 'equals', 'value' => '2007-07-01 06:12:45'), 5 => array('attributeName' => 'decimalCstm', 'operatorType' => 'equals', 'value' => (double) 45.6), 6 => array('attributeName' => 'dropDownCstm', 'relatedAttributeName' => 'value', 'operatorType' => 'equals', 'value' => '3'), 7 => array('attributeName' => 'integerCstm', 'operatorType' => 'equals', 'value' => (int) 67876), 8 => array('attributeName' => 'phoneCstm', 'operatorType' => 'startsWith', 'value' => '123456'), 9 => array('attributeName' => 'radioCstm', 'relatedAttributeName' => 'value', 'operatorType' => 'equals', 'value' => '2'), 10 => array('attributeName' => 'textCstm', 'operatorType' => 'startsWith', 'value' => 'Some Text'), 11 => array('attributeName' => 'textAreaCstm', 'operatorType' => 'contains', 'value' => 'Some description'), 12 => array('attributeName' => 'urlCstm', 'operatorType' => 'contains', 'value' => 'somesite.com'));
     $compareStructure = '1 and 2 and 3 and 4 and 5 and 6 and 7 and 8 and 9 and 10 and 11 and 12';
     $this->assertEquals($compareClauses, $searchAttributeData['clauses']);
     $this->assertEquals($compareStructure, $searchAttributeData['structure']);
     //Build the query 'where' and 'joins'. Confirm they are as expected
     $quote = DatabaseCompatibilityUtil::getQuote();
     $joinTablesAdapter = new RedBeanModelJoinTablesQueryAdapter('Account');
     $where = RedBeanModelDataProvider::makeWhere('Account', $searchAttributeData, $joinTablesAdapter);
     $compareWhere = "({$quote}account{$quote}.{$quote}checkboxcstm{$quote} = 1)" . " and ({$quote}account{$quote}.{$quote}currencycstm_currencyvalue_id{$quote} = 108.45)" . " and ({$quote}account{$quote}.{$quote}datecstm{$quote} = '2007-07-01')" . " and ({$quote}account{$quote}.{$quote}datetimecstm{$quote} = '2007-07-01 06:12:45')" . " and ({$quote}account{$quote}.{$quote}decimalcstm{$quote} = 45.6)" . " and ({$quote}customfield{$quote}.{$quote}value{$quote} = '3')" . " and ({$quote}account{$quote}.{$quote}integercstm{$quote} = 67876)" . " and ({$quote}account{$quote}.{$quote}phonecstm{$quote} like '123456%')" . " and ({$quote}customfield1{$quote}.{$quote}value{$quote} = '2')" . " and ({$quote}account{$quote}.{$quote}textcstm{$quote} like 'Some Text%')" . " and ({$quote}account{$quote}.{$quote}textareacstm{$quote} like '%Some description%')" . " and ({$quote}account{$quote}.{$quote}urlcstm{$quote} like '%somesite.com%')" . "";
     $this->assertEquals($compareWhere, $where);
     $this->assertEquals(0, $joinTablesAdapter->getFromTableJoinCount());
     $this->assertEquals(2, $joinTablesAdapter->getLeftTableJoinCount());
     $leftTables = $joinTablesAdapter->getLeftTablesAndAliases();
     $this->assertEquals('customfield', $leftTables[0]['tableName']);
     $this->assertEquals('customfield', $leftTables[1]['tableName']);
     //Now test that the subsetSQL query produced is correct.
     $subsetSql = Account::makeSubsetOrCountSqlQuery('account', $joinTablesAdapter, 1, 5, $where, null);
     $compareSubsetSql = "select {$quote}account{$quote}.{$quote}id{$quote} id ";
     $compareSubsetSql .= "from {$quote}account{$quote} ";
     $compareSubsetSql .= "left join {$quote}customfield{$quote} on ";
     $compareSubsetSql .= "{$quote}customfield{$quote}.{$quote}id{$quote} = {$quote}account{$quote}.{$quote}dropdowncstm_customfield_id{$quote} ";
     $compareSubsetSql .= "left join {$quote}customfield{$quote} customfield1 on ";
     $compareSubsetSql .= "{$quote}customfield1{$quote}.{$quote}id{$quote} = {$quote}account{$quote}.{$quote}radiocstm_customfield_id{$quote} ";
     $compareSubsetSql .= "where " . $compareWhere . ' ';
     $compareSubsetSql .= 'limit 5 offset 1';
     $this->assertEquals($compareSubsetSql, $subsetSql);
     //Make sure the sql runs properly.
     $data = Account::getSubset($joinTablesAdapter, 0, 5, $where, null);
 }