/** * Returns an SQL search statement * * The whereclause should NOT start with WHERE * The whereclause should contain the output of may_read_SQL and * can also be used for sorting */ function search($db, $tableinfo, $fields, &$fieldvalues, $whereclause = false, $wcappend = true) { global $db_type; $columnvalues = $fieldvalues; /* It seems we getter better performance by only asking for id keep this code here to revert to in case of side-effetcs // change fields into a SQL string that works with multiple tables $fieldsarray=explode(',',$fields); foreach ($fieldsarray as $field) $fieldsSQLstring.=$tableinfo->realname.".$field AS $field, "; $fieldsSQLstring=substr($fieldsSQLstring,0,-2); // SELECT part //$query[0]="SELECT $fieldsSQLstring "; //FROM ".$tableinfo->realname." WHERE "; */ // SELECT part $query[0] = "SELECT {$tableinfo->realname}.id "; // FROM part if ($db_type == 'mysql') { $query[1] = 'FROM ' . $tableinfo->realname . ' '; } else { // non sql databases use tempb table to determine whether user may read a record. Newer Postgres database need tempb in the SQL statement $query[1] = 'FROM tempb, ' . $tableinfo->realname . ' '; } // WHERE part $query[2] = 'WHERE '; // flag telling whether WHERE field already contains a statement $query[5] = false; $column = strtok($fields, ','); while ($column) { if ($query[5]) { $query = searchhelp($db, $tableinfo, $column, $columnvalues, $query, $wcappend, "AND"); } else { $query = searchhelp($db, $tableinfo, $column, $columnvalues, $query, $wcappend, $and); } $column = strtok(','); } /* * Ugly hack needed here. Go through the sort string (in whereclause) * and if there is there an assist tabel in there, we need to make a left join * There must be a nicer way to figure this all out. */ if ($whereclause) { // figure out if there assist tables in the ORDER By part $words = preg_split('/ /', $whereclause); $counter = 0; foreach ($words as $word) { $parts = explode('_', $word); // Second part of the if is for the old style naming of assist tables... if (substr($parts[1], -3) == 'ass' || substr($parts[0], 0, 3) == 'ass') { // found assist table so add LEFT JOIN $dotparts = explode('.', $word); $query[1] .= 'LEFT JOIN ' . $dotparts[0] . " ON {$dotparts[0]}.id={$tableinfo->realname}.{$dotparts['1']} "; // we'll also need to clean up the order by string $direction = 'asc'; for ($j = 1; $j < 4; $j++) { if (substr($words[$counter + $j], 0, 3) == 'asc') { $direction = 'asc'; break; } elseif (substr($words[$counter + $j], 0, 4) == 'desc') { $direction = 'desc'; break; } } $newwhereclause .= $dotparts[0] . '.sortkey ' . $direction . ', ' . $dotparts[0] . '.type '; // the last asc/desc will be added in the next loop (below) } else { $newwhereclause .= $word . ' '; } $counter++; } $whereclause = $newwhereclause; if ($query[5]) { $query[2] .= "AND {$whereclause}"; } else { $query[2] .= $whereclause; } } if (function_exists('plugin_search')) { $query[0] = plugin_search($query[0], $columnvalues, $query[1]); } $result = $query[0] . $query[1] . $query[2]; //echo "$result.<br>"; return $result; }
if (isset($settings['screenshot']) && $settings['screenshot'] == 'enabled') { // Only with screenshot $solr_params['fq']['screenshot'] = 'screenshots_i:1'; } break; } } } // Support for ?owner={username} query parameter $owner = get_user_by_username(get_input('owner')); if ($owner) { $solr_params['fq']['owner'] = 'owner_guid:' . $owner->guid; } // Get objects elgg_set_context('search'); $result = plugin_search(null, null, array(), $solr_params); $list = elgg_view_entity_list($result['entities'], array('limit' => $limit, 'offset' => $offset, 'count' => $result['count'])); elgg_set_context('plugins'); $title = elgg_echo('plugins:search:title'); // Add sidebar filter $sidebar = elgg_view('plugins/filters', array('categories' => $CONFIG->plugincats, 'versions' => $CONFIG->elgg_versions, 'licences' => $CONFIG->gpllicenses, 'current_values' => $filters, 'settings' => $settings)); // Add info block on search results to the main area if ($result['count']) { $first_index = $offset + 1; $last_index = min(array($offset + $limit, $result['count'])); $heading = elgg_view_title(sprintf(elgg_echo('plugins:search:results'), $result['count'], $first_index, $last_index)); } else { $heading = elgg_view_title(elgg_echo('plugins:search:noresults')); $main = elgg_echo('plugins:search:noresults:info'); } // Add the list of plugins to the main area