<?php

// /etc/init.d/sphinxsearch start
require_once ( "Config.inc.php" );
require_once ( "Connection.inc.php" );
require_once ( "Sphinxapi.inc.php" );
//require_once ( "Functions.inc.php" );

class Search {

	public function SphinxSearch( $SearchQuery ){

		if ( !preg_match('/([\w+]|[\d+]|[^A-Za-z0-9]|[a-z]|[0-9]{2,})/i', $SearchQuery) || strlen($SearchQuery) <= 1 ){
		//	echo "SphinxSearch searchquery is null: $SearchQuery<br />";
			$ResultArray	= array();
			return $ResultArray;
		};
	
		$config 	= new Config();
		$conn 		= new Connection( );
		$pdo		= $conn->prepareQuery();
		$maxresults = $config->search_max_results();
		$db 		= $config->sql_dbname();
		$tbl 		= $config->sql_tablename_publish_de();
		$index		= $config->sql_dbname();
		
		$cl 		= new SphinxClient();
		$q 			= $SearchQuery;
		$sql 		= "";
		$host 		= "localhost";
		$port 		= 9312;
		$groupby 	= "";
		$groupsort 	= "@group desc";
		$filter 	= "group_id";
		$filtervals = array();
		$distinct 	= "";
		$sortby 	= "";
		$limit 		= $maxresults;
		$ranker 	= SPH_RANK_PROXIMITY_BM25;
		$select 	= "";
		$docids 	= array();

		//$mode = "SPH_MATCH_FULLSCAN";
		//$mode = "SPH_MATCH_ANY";
		//$mode = "SPH_MATCH_BOOLEAN";
		//$mode = "SPH_MATCH_EXTENDED";
		$mode = 'SPH_MATCH_EXTENDED2';
		//$mode = "SPH_MATCH_PHRASE";

		//echo "good";
		////////////
		// do query
		////////////127.0.0.1:9312
	//	$cl->SetServer("/var/run/searchd.sock", 0);
		$cl->SetServer ( $host, $port );
		$cl->SetConnectTimeout ( 3 );
		$cl->SetArrayResult ( true );
		$cl->SetMatchMode ( SPH_MATCH_ANY );
		$cl->SetFieldWeights ( array ( "p_headline"=>10, "p_articletext"=>8, "p_picture_1_description"=>4,"p_tags"=>7 ) );
		$cl->ResetFilters();
		//$cl->SetSortMode( SPH_SORT_RELEVANCE );
		$cl->SetSortMode ( SPH_SORT_EXTENDED, "@relevance DESC" );
		$cl->SetRankingMode( $ranker );
		$cl->SetGroupDistinct ( $distinct );

		//if ( $sortby )				$cl->SetSortMode ( SPH_SORT_EXTENDED, $sortby );
		//if ( $sortexpr )			$cl->SetSortMode ( SPH_SORT_EXPR, $sortexpr );

		$cl->SetSelect ( $select );
		$cl->SetLimits ( 0, $maxresults );
		//echo "good 2";
		$res = $cl->Query ( $q, $index );
		//echo "good 3";

		if ( $res===false )
		{
		//	echo "Query failed: " . $cl->GetLastError() . ".\n";

		} else {
		//	if ( $cl->GetLastWarning() ) {
		//		echo "WARNING: " . $cl->GetLastWarning() . "\n\n";
		//	};
		//	echo count($res["matches"]); 
		//	echo "<br>";
			
			if ( is_array($res["matches"]) )
			{
				$n = 1;
				foreach ( $res["matches"] as $docinfo )
				{
				//	echo "$n. doc_id=$docinfo[id], weight=$docinfo[weight]<br />";
					array_push($docids, $docinfo["id"]);

				}
			}
		}
		
	//	print_r($docids);

		$ResultArray	= array();

		if (count($docids) <= 0 ){
			return $ResultArray; // gib leeres array zur�ck
		};

		$SqlQuery	= "SELECT p_headline,p_shortcode,p_timestamp,p_isonline,p_articletext,p_picture_1_description FROM $tbl WHERE";
			for ($i=0;$i<=count($docids) - 1;$i++){
				if ($i>0){
					$SqlQuery .= "\"$docids[$i]\",";
				} elseif($i<=0){
					$SqlQuery .= " `id` IN (\"$docids[$i]\",";
				};
			};
			$SqlQuery = substr($SqlQuery,0,(strlen($SqlQuery)-1));
			$SqlQuery .=") AND p_isonline=1 ORDER BY p_timestamp DESC LIMIT $maxresults;";
			
		$stmt = $pdo->prepare($SqlQuery); // AND p_online=1
		$stmt->execute();

		while($rows = $stmt->fetch(PDO::FETCH_ASSOC)) {
		
			$headline			= $rows["p_headline"];
			$shortcode			= $rows["p_shortcode"];
			$article			= $rows["p_articletext"];
			$pic_desc			= $rows["p_picture_1_description"];
		/*	$author				= $rows["p_authorname"];
			$backlink			= $rows["p_backlink"];
			$category_id		= $rows["p_category"];
		*/
			if (strlen($headline)>5){
				array_push($ResultArray, "$headline#####$shortcode#####$article#####$pic_desc\n");
			}
		//	echo "$mode ---> $fn#####$path<br />\n";
		}; # while( $sql_results = mysql_fetch_array($results)) { }
	
		return $ResultArray;

	} // function SphinxSearch( $SearchQuery, $catg ){
}
?>