public static function logHit($query)
 {
     // create or update log
     $existing = SearchLog::get()->filter(array('Query' => $query))->first();
     if ($existing) {
         $existing->Count = $existing->Count + 1;
         $existing->write();
     } else {
         $log = new SearchLog();
         $log->Query = $query;
         $log->Count = 1;
         $log->write();
     }
 }
 public function testLogging()
 {
     /** @var Member $m1 */
     $m1 = $this->objFromFixture('Member', 'm1');
     $m1->logOut();
     $this->assertEquals(0, SearchLog::get()->count());
     // Searching for nothing should not leave a record
     ShopSearch::inst()->search(array());
     $this->assertEquals(0, SearchLog::get()->count());
     // Searching should leave a log record
     ShopSearch::inst()->search(array('q' => 'green'));
     $this->assertEquals(1, SearchLog::get()->count());
     $log = SearchLog::get()->last();
     $this->assertEquals('green', $log->Query);
     $this->assertEquals(2, $log->NumResults);
     $this->assertEquals(0, $log->MemberID);
     // If we log in as a customer, the search log should register that
     $m1->logIn();
     ShopSearch::inst()->search(array('q' => 'purple'));
     $this->assertEquals(2, SearchLog::get()->count());
     $log = SearchLog::get()->last();
     $this->assertEquals('purple', $log->Query);
     $this->assertEquals(1, $log->NumResults);
     $this->assertEquals($m1->ID, $log->MemberID);
     $m1->logOut();
     // Refining a search several times should leave us a crumb trail
     $s = ShopSearch::inst();
     $r = $s->search(array('q' => 'green'));
     $this->assertNotNull($r->SearchBreadcrumbs, 'Search crumb exists');
     $this->assertEquals(1, $r->SearchBreadcrumbs->count(), 'Search crumb should have 1 entry');
     $this->assertEquals('Search: green', $r->SearchBreadcrumbs->first()->Title, 'Search crumb label should be correct');
     $r = $s->search(array('q' => 'green', '__ps' => $r->SearchLogID, '__t' => 'Model: ABC', 'f' => array('Model' => 'ABC')));
     $this->assertEquals(2, $r->SearchBreadcrumbs->count(), 'Search crumb should have 2 entries');
     $this->assertEquals('Search: green', $r->SearchBreadcrumbs->first()->Title, 'Search crumb should contain previous search');
     $this->assertEquals('Model: ABC', $r->SearchBreadcrumbs->last()->Title, 'Search crumb should contain current search');
     $r = $s->search(array('q' => 'green', '__ps' => $r->SearchLogID, '__t' => 'Price: $10.50', 'f' => array('Model' => 'ABC', 'Price' => '10.50')));
     $this->assertEquals(3, $r->SearchBreadcrumbs->count(), 'Search crumb should have 3 entries');
     $this->assertEquals('Search: green', $r->SearchBreadcrumbs->first()->Title, 'Search crumb should contain first search');
     $this->assertEquals('Model: ABC', $r->SearchBreadcrumbs->offsetGet(1)->Title, 'Search crumb should contain previous search');
     $this->assertEquals('Price: $10.50', $r->SearchBreadcrumbs->last()->Title, 'Search crumb should contain current search');
     $r = $s->search(array('q' => 'purple'));
     $this->assertEquals(1, $r->SearchBreadcrumbs->count(), 'Search crumb should reset');
 }
 public function sourceRecords($params, $sort, $limit)
 {
     return SearchLog::get();
 }