public function onSearch(&$query, &$where, $search)
 {
     if ($search !== "") {
         $_query = array();
         $searchColumns = array('address', 'postcode', 'description');
         $db = JFactory::getDbo();
         foreach ($searchColumns as $searchColumn) {
             if (isset($search[$searchColumn]) && $search[$searchColumn] !== '') {
                 $_query[] = $db->quoteName($searchColumn) . " LIKE " . $db->quote("%" . $search[$searchColumn] . "%");
             }
         }
         $addressIds = array();
         if (isset($search['address_id']) && $search['address_id'] > 1) {
             $addresses = JUDirectoryHelper::getAddressTree($search['address_id'], true, true);
             if ($addresses) {
                 foreach ($addresses as $address) {
                     $addressIds[] = $address->id;
                 }
             }
         }
         if ($addressIds) {
             $_query[] = 'address.id IN (' . implode(',', $db->quote($addressIds)) . ')';
         }
         if ($_query) {
             $query->join('LEFT', '#__judirectory_locations AS location ON location.listing_id = listing.id');
             if ($addressIds) {
                 $query->join('LEFT', '#__judirectory_addresses AS address ON address.id = location.address_id');
             }
             $search_operator = $this->params->get("search_operator", 0);
             if ($search_operator == 0) {
                 $search_operator = $search['condition'];
             }
             $condition = $search_operator == 1 ? 'AND' : 'OR';
             $where[] = '(' . implode($_query, ' ' . $condition . ' ') . ')';
         }
     }
 }