<?php

namespace OfficeBrain\Bundle\SolrBundle\SearchServices;
use OfficeBrain\Bundle\CoreBundle\Cache\RedisCacheService;

/**
 * Search service class to manage Product related searches
 *
 * @author OfficeBrain 4220 <info@officebrain.com>
 *
 */
class ProductService {
	private $clientFactoryService;
	private $defaultSearchCulture;
	protected $searchClient;
	protected $priceQtyRange;
	private $serviceContainer;

	private $setSelectedFld;
	// set const value for : Sorting after applying quantity filter and shown price of that quantity.
	CONST MAX_QTY = 999999;
	/**
	 * Constructor for product services.
	 *
	 * @param string $defaultSearchCulture
	 *        	default search culture
	 * @param ClientFactory $clientFactoryService
	 *        	client factory service
	 * @param integer $priceQtyRange
	 *        	default price qty allowed range listimage
	 */
	public function __construct($defaultSearchCulture, ClientFactory $clientFactoryService, $priceQtyRange,$entitymanager) {
		$this->clientFactoryService = $clientFactoryService;
		$this->entitymanager = $entitymanager;
		$this->setSearchCulture ( $defaultSearchCulture );
		$this->setSearchClient ( $this->defaultSearchCulture );
		$this->priceQtyRange = $priceQtyRange;
		$this->serviceContainer = $this->clientFactoryService->getContainer();
		$this->container = $this->serviceContainer;
		$this->attributeColorMasterColorMappingRepository = $this->entitymanager->getRepository('OfficeBrainAttributeBundle:AttributeColorMasterColorMapping');
		$this->masterColorSwatches = $this->serviceContainer->getParameter("master_color_swatches");
		
		$temp = $this->masterColorSwatches;
		$this->masterColorSwatches = array();
		// Reformat the master colors
		foreach($temp as $tempIndex => $tempData)
		{
			$this->masterColorSwatches[$tempData['client_master_id']] = $tempData['name'];
		}
		$this->masterColorSwatchesKeys = array_keys($this->masterColorSwatches);

		$this->request = $this->serviceContainer->get('request');
		$this->serviceGroupAPiClient = $this->serviceContainer->get('office_brain_service_group_api');
		$this->projectSetting = $this->request->get('project_setting');
		$this->priceInDecimal = isset($this->projectSetting['price_in_decimal'])?$this->projectSetting['price_in_decimal']:3;
		
		$this->configurationRule = $this->projectSetting['configuration_rule']['promo_discount'];
		$this->isDiscountCodeApply = ($this->configurationRule['option']['apply_code_on_product_detail']['status']==1) ? true : false;

		if ($this->isDiscountCodeApply) { //$loggedInUserServiceGroupId
			//call discount code API
			$this->discountCodes = $this->getDiscountCodeArray();
		}
		
		if($this->serviceContainer->get('security.context')->getToken() != null)
		{
			$this->user = $this->serviceContainer->get('security.context')->getToken()->getUser();
		}
		else
		{
			$this->user = "";
		}
		
		$this->statsh_cache_wrapper=RedisCacheService::create();
		$this->setSelectedFld=null;
	}

	/**
	 * set search culture and according to that change seach client.
	 *
	 * @param string $culture
	 */
	public function setSearchCulture($culture) {
		$this->defaultSearchCulture = $culture;
		// on change of search culture we will dynamically change the search client here
		$this->setSearchClient ( $culture );
	}

	/**
	 * get search culture type
	 *
	 * @return string
	 */
	public function getSearchCulture() {
		return $this->defaultSearchCulture;
	}

	/**
	 * get update instance
	 *
	 * @return Object update instance
	 */
	public function getCreateUpdateInstance() {
		return $this->searchClient->createUpdate ();
	}

	/**
	 * get solr query instance
	 *
	 * @return search query instance
	 */
	public function getCreateQueryInstance() {
		// return $this->searchClient->createQuery($this->searchClient::QUERY_SELECT);
		//echo get_class($this->searchClient);die;
		return $this->searchClient->createSelect ();
	}

	/**
	 * get solr suggester query instance
	 *
	 * @return search query instance
	 */
	public function getCreateSuggesterQueryInstance() {
		// return $this->searchClient->createQuery($this->searchClient::QUERY_SELECT);
		return $this->searchClient->createSuggester ();
	}

	/**
	 * get search client
	 *
	 * @return searchClient
	 */
	public function getSearchClient() {
	    //echo get_class($this->searchClient);die;
		return $this->searchClient;
	}

	/**
	 * Create solr index function
	 *
	 * @param SolrUpdate $update
	 *        	update instance
	 * @param Object $product
	 *        	product instance
	 * @param boolean $commit
	 *        	if true than commit data to solr
	 */
	public function createIndex($update, $product, $commit = true) { 
	$doc = $update->createDocument ();
	
    $doc->instance_id_i=!empty($product['instance_id']) && is_int($product['instance_id']) ? $product['instance_id']:1;

    $doc->currency_name_s = $product['currency']['name'];


		$doc->rating_f = $product['rating'];
		$doc->id = $doc->instance_id_i."-".$product['product_id'];
		/*
		$public_tag = array(
				array('1'=>'New'),
				array('1'=>'New','2'=>'Sale'),
				array('2'=>'Sale'),
				array('3'=>'Closeout'),
				array('4'=>'Overstock'));
		$private_tag = array(
				array('5'=>'Made In USA','6'=>'Christmas Offer'),
				array('7'=>'Father\'s Day'),
				array('8'=>'Mother\'s Day'),
				array('5'=>'Made In USA'),
				array('6'=>'Christmas Offer')
		);

		$rand_public_tag = rand(0,4);
		$rand_private_tag = rand(0,4);

		$data = $public_tag[$rand_public_tag];
		$doc->public_custom_tag_is = array_keys($data);
		$doc->public_custom_tag_ss = $data;

		$data = $private_tag[$rand_private_tag];
		$doc->private_custom_tag_is = array_keys($data);;
		$doc->private_custom_tag_ss= $data;
    */


    /* Set Custom Tags start */
    if(isset($product['private_custom_tags']))
    {
        $doc->private_custom_tag_is = array_keys($product['private_custom_tags']);
        $doc->private_custom_tag_ss= $product['private_custom_tags'];
       
        if(in_array($this->serviceContainer->getParameter("product_filter.slug"),$product['private_custom_tags'])){        	
        	$doc->private_custom_tag_sort_i = 1;
        }
    }

    if(isset($product['public_custom_tags']))
    {
        $doc->public_custom_tag_is = array_keys($product['public_custom_tags']);
        $doc->public_custom_tag_ss= $product['public_custom_tags'];
    }
    if(isset($product['custom_tag_style_ss']))
    {
    	$doc->custom_tag_style_ss = $product['custom_tag_style_ss'];    	
    }
    
    if(isset($product['custom_campaigns']))
    {
		//$privateCampaignMasterObj = $this->master_repository->find($parameters['campaign_id']);
		/*if($privateCampaignMasterObj->getShowOnweb()=="yes"){
			$doc->private_custom_is_show_campaign_t = "yes";
		}else{
			$doc->private_custom_is_show_campaign_t = "no";
		}*/
    	$doc->custom_campaigns_is = array_keys($product['custom_campaigns']);
    	$doc->custom_campaigns_ss= $product['custom_campaigns'];
    	
    	if(isset($product['is_show_campaign']))
		{
			if($product['is_show_campaign']=="yes"){
				$doc->private_custom_is_show_campaign_t = "yes";
			}else{
				$doc->private_custom_is_show_campaign_t = "no";
			}
		}
    }
    
    
    
    /* Set Custom Tags end */

		$doc1 = $update->createDocument ();
		$doc1->id = "subdoc-".$doc->id;
		$doc1->slug_t = $product ['basic_information'] ['slug'];
		$doc1->instance_id_i=!empty($product['instance_id']) && is_int($product['instance_id']) ? $product['instance_id']:1;
		$doc1->product_id_i = $product ['product_id'];
		
		//$doc->childDoc = array($doc1);//EMP4464: Uncomment this line to add child document

		$doc->culture_product_id_i = $product ['culture_product_id'];
		$doc->product_id_i = $product ['product_id'];
		$doc->slug_t = $product ['basic_information'] ['slug'];
		$doc->price_unit_s = $product ['price_unit'];
		$doc->keyword_ss = $product ['keyword'];


		$doc->category_is = array_keys ( $product ['category'] );
		// added custom category logic
		// if (isset($product['custom_category_id'])) {
		// $doc->custom_category_id_is = $product['custom_category_id'];
		// $doc->custom_category_id_txt = $product['custom_category_name'];
		// }
		if(isset($product ['basic_information']['original_sku_number']))
        {
            $doc->original_sku_number_s = $original_sku_number = $product ['basic_information']['original_sku_number'];
        }

		$doc->supplier_id_i = $product ['supplier'] ['supplier_id'];
		$doc->supplier_s = $product ['supplier'] ['name'];
		$doc->supplier_t = $product ['supplier'] ['name'];
		//$doc->original_supplier_id_i = $product ['original_supplier_id'];
		// $doc->brand_i = $product->brand;

		if (isset ( $product ['min_price'] )) {
			$doc->min_price_f = $product ['min_price'];
			$doc->min_code_s = $product ['min_qty_code'];
			$doc->coded_min_price_f = $this->applyDiscountCode($product ['min_price'],$product ['min_qty_code']);
		}
		if (isset ( $product ['us_min_price'] )) {
			//	echo ">>>>>>>".$product ['ca_min_price'];exit;
			$doc->us_min_price_f = $product ['us_min_price'];
			$doc->us_min_code_s = $product ['us_min_qty_code'];
			$doc->us_coded_min_price_f = $this->applyDiscountCode($product ['us_min_price'],$product ['us_min_qty_code']);
		}
		if (isset ( $product ['ca_min_price'] )) {
			//	echo ">>>>>>>".$product ['ca_min_price'];exit;
			$doc->ca_min_price_f = $product ['ca_min_price'];
			$doc->ca_min_code_s = $product ['ca_min_qty_code'];
			$doc->ca_coded_min_price_f = $this->applyDiscountCode($product ['ca_min_price'],$product ['ca_min_qty_code']);
		}
		if (isset ( $product ['us_max_price'] )) {
			$doc->us_max_price_f = $product ['us_max_price'];
			$doc->us_max_code_s = $product ['us_max_qty_code'];
			$doc->us_coded_max_price_f = $this->applyDiscountCode($product ['us_max_price'],$product ['us_max_qty_code']);
		}
		if (isset ( $product ['ca_max_price'] )) {
			$doc->ca_max_price_f = $product ['ca_max_price'];
			$doc->ca_max_code_s = $product ['ca_max_qty_code'];
			$doc->ca_coded_max_price_f = $this->applyDiscountCode($product ['ca_max_price'],$product ['ca_max_qty_code']);
		}
		if (isset ( $product ['max_price'] )) {
			$doc->max_price_f = $product ['max_price'];
			$doc->max_code_s = $product ['max_qty_code'];
			$doc->coded_max_price_f = $this->applyDiscountCode($product ['max_price'],$product ['max_qty_code']);
		}
		if (isset ( $product ['min_qty'] )) {
			$doc->min_quantity_i = $product ['min_qty'];
			$doc->coded_min_quantity_i = $product ['min_qty'];
		}
		if (isset ( $product ['max_qty'] )) {
			$doc->max_quantity_i = $product ['max_qty'];
			$doc->coded_max_quantity_i = $product ['max_qty'];
		}
		
		if(isset( $product ['supplier']['ob_customer_id']) && $product ['supplier']['private'] == 1){
			$doc->distributor_id_s = $product ['supplier']['ob_customer_id'];
			$doc->quote_s = 'yes';
		}elseif(isset( $GLOBALS['distributorID']) && $GLOBALS['distributorID']!= 0){
			$doc->distributor_id_s = $product ['supplier']['ob_customer_id'];
			$doc->quote_s = 'yes';
		}
		$doc->sku_t = $product ['basic_information'] ['sku_number'];
		$doc->sku_s = $product ['basic_information'] ['sku_number'];
		//$doc->sku_exact = $product ['basic_information'] ['sku_number'];
		// added special field in solr for sku
		$doc->sku = $product ['basic_information'] ['sku_number'];
		// $doc->country_is = $product->country;

		$doc->title_t = trim($product ['basic_information'] ['title']);
		$doc->title_s = trim($product ['basic_information'] ['title']);
		$doc->description_t = $product ['basic_information'] ['description'];

		// $doc->image_i = $product->image;
		$doc->image_path_t = $product ['basic_information'] ['default_image_url'];
		$doc->image_thumb_path_t = $product ['basic_information'] ['default_image_thumb_url'];
    	if(!empty($product ['basic_information'] ['video_url'])) {
     	 $doc->video_url_t = $product ['basic_information'] ['video_url'];
    	}

    if(!empty($product ['basic_information'] ['video_url'])) {
      $doc->video_url_t = $product ['basic_information'] ['video_url'];
    }
		/*****************For Variation Images*******************************/
		$variation_images_path = array();
		$variation_images_id = array();
		$master_color = array();
		$master_color_image_search = array();
    	/*foreach ($product['images'] as $value){

    		if(!in_array($value['master_color'],$product ['keyword'])){
    			//$product ['keyword'][] = $value['master_color'];
    		}
    		if(!in_array($value['actual_color'],$product ['keyword'])){
    			//$product ['keyword'][] = $value['actual_color'];
    		}
    		//$variation_images_path[] = $value['url'];
    		//$variation_images_id[] = $value['actual_color_id'];
        if(empty($value['master_color_id']))
          $value['master_color_id']='';
    		//$master_color[] = $value['master_color_id'].'##'.$value['master_color'].'|'.$value['actual_color_id'].'##'.$value['actual_color'];
    		//$master_color_image_search[] = $value['master_color_id'].'##'.$value['master_color'].'|'.$value['actual_color_id'].'##'.$value['actual_color'].'|'.$value['image_path'];
    	}*/

    	/* New logic to push color from attributes - starts */

    	if(isset($product['attributes']) && (!(empty($product['attributes'])))){
			foreach($product['attributes'] as $attribute){
				if(isset($attribute['label']) && strtolower($attribute['label'])=='colors' && !empty($attribute['values'])){
					foreach($attribute['values'] as $color_id=>$color_name){
						
						$colorImageData = '';
						if(isset($product['images']) && (!(empty($product['images'])))){
							// Assign default color image as color image data is null
							foreach ($product['images'] as $imageData){
								if(isset($imageData['is_default']) && $imageData['is_default'] == 1)
								{
									$colorImageData = $imageData;
								}
							}
							// Override default color image if color has any image assigned
							foreach ($product['images'] as $imageData){
								if(isset($imageData['actual_color_id']) && $imageData['actual_color_id'] > 0)
								{
									if($imageData['actual_color_id'] == $color_id)
									{
										$colorImageData = $imageData;
									}
								}
							}
						}
						

						if(!in_array($color_name,$product ['keyword'])){
							$product ['keyword'][] = $color_name;
						}
						
						// Fetch all master ids of this attribute
						$masterColorIdArray = array();
						$selectedMasterColorObjArray = $this->attributeColorMasterColorMappingRepository->findByAttributeColorId($color_id);
						if(isset($selectedMasterColorObjArray) && is_array($selectedMasterColorObjArray) && (!(empty($selectedMasterColorObjArray))))
						{
							foreach($selectedMasterColorObjArray as $selectedMasterColorObjArrayIndex => $selectedMasterColorObj)
							{
								$masterColorIdArray[] = $selectedMasterColorObj->getMasterColorId();
							}
						}
						$masterColorIdArray = array_unique($masterColorIdArray);
						
						foreach($masterColorIdArray as $masterColorId)
						{
							if(in_array($masterColorId,$this->masterColorSwatchesKeys))
							{
								$master_color_id=$masterColorId;
			          			$master_color_name=isset($this->masterColorSwatches[$masterColorId])?$this->masterColorSwatches[$masterColorId]:'ERROR';
			          			if(!in_array($master_color_name,$product ['keyword'])){
			          				$product ['keyword'][] = $master_color_name;
			          			}
			          			$variation_images_path[] = $colorImageData['url'];
			          			$variation_images_id[] = $color_id;
								$master_color[] = $master_color_id.'##'.$master_color_name.'|'.$color_id.'##'.$color_name;
								$master_color_image_search[] = $master_color_id.'##'.$master_color_name.'|'.$color_id.'##'.$color_name.'|'.$colorImageData['image_path'];								
							}
						}
					}
				}
			}
		}

    	/* New logic to push color from attributes - ends */
		
    	$doc->keyword_txt = $product ['keyword'];
    	$doc->color_mapping = $master_color;
    	$doc->color_search_image = $master_color_image_search;
    	$doc->color_mapping_search = $master_color;
    	$doc->variation_image_path_txt = $variation_images_path;
    	$doc->variation_image_id_ss = $variation_images_id;

    	/************************************************/
		if (isset ( $product ['product_attributes'] ))
			$doc->attribute_ss = $product ['product_attributes'];

		$sizeAttributeId  = $this->serviceContainer->getParameter("size_attribute_id");
		$colors = array();
		$sizes = array();
		$sizeIds = array();
		$inks = array();
		$inkIds = array();
		
		if(isset($product['production_time']))
		{
			$productionTimeId  = $product ['production_time'];
			$productionTimes = array();
			$productionTimes[] = $product['production_time'];
		}
		
		if(isset($product['production_time_unit']))
		{	
			$productionTimesUnit = array();
			$productionTimesUnit[] = $product['production_time_unit'];
		}
		
		if(isset($product['fob']))
		{
			$fobId  = $product['fob'];
			$fobs = array();
			$fobs[] = $product['fob'];
		}
		
		if(isset($product['fob_city_state']))
		{
			$fobCityState = array();
			$fobCityState[] = $product['fob_city_state'];
		}
		
		if(isset($product['attributes'])){
			foreach($product['attributes'] as $attribute){
				if(isset($attribute['label']) && strtolower($attribute['label'])=='colors' && !empty($attribute['values'])){
					foreach($attribute['values'] as $color_id=>$values){
						$colors[] = $attribute['id'].'|'.$color_id;
					}
				}
				if($attribute['id'] == $sizeAttributeId){
					foreach($attribute['values'] as $valueId=>$sizeValue){
						$sizes[] = $valueId."|".$sizeValue;
						$sizeIds[] = $valueId;
					}
				}
				if(isset($attribute['label']) && strtolower($attribute['label'])=='ink' && !empty($attribute['values'])){
					foreach($attribute['values'] as $inkId=>$values){
						$inks[] = $inkId.'|'.$values;
						$inkIds[] = $inkId;
					}
				}
			}
		}
		
		if(!empty($sizes)){
			$doc->size_ss = $sizes;
		}
		if(!empty($sizeIds)){
			$doc->size_id_is = $sizeIds;
		}
		
		if(!empty($inks)){
			$doc->ink_ss = $inks;
		}
		if(!empty($inkIds)){
			$doc->ink_id_is = $inkIds;
		}
		
		if(!empty($productionTimes)){
			$doc->production_time_i = $productionTimes;
		}
		
		if(!empty($productionTimesUnit)){
			$doc->production_time_unit_ss = $productionTimesUnit;
		}
		
		if(!empty($fobs)){
			$doc->fob_ss = $fobs;
		}
		
		if(isset($fobCityState) && !empty($fobCityState)){
			$doc->fob_city_state_ss = $fobCityState;
		}
		
		//print_r($colors);die;
		if(count($colors)){
			$doc->color_ss = $colors;
		}
			// / according to defualt $product->priceQtyRanges set range for data.
		if (isset ( $product ['priceQtyRanges'] ) && count ( $this->priceQtyRange ) > 0) {
		    $this->setProductPriceMapping($doc, (isset($product ['priceQtyRanges'])?$product ['priceQtyRanges']:''),'');
		}
    // set Group wise Price
    	$this->setProductGroupPriceMapping($doc, $product);

		// TODO - start added for promocan
		if (isset ( $product ['call_for_price'] )) {
			$doc->call_for_price_s = $product ['call_for_price'];
		}
		if (isset ( $product ['base_price'] )) {
			if ($product ['base_price'] == "") {
				$product ['base_price'] = 0;
			}
			$doc->base_price_f = $product ['base_price'];
		}
		if (isset ( $product ['brand'] ) && isset ( $product ['brand'] ['name'] )) {
			$doc->line_name_t = $product ['brand'] ['name'];
			$doc->line_name_s = $product ['brand'] ['name'];
		}
		if (isset ( $product ['brand'] ) && isset ( $product ['brand'] ['id'] ) && $product ['brand'] ['id'] > 0) {
			$doc->line_name_id_i = $product ['brand'] ['id'];
		}else{
			$doc->line_name_id_i = 0;
		}
		
		if(isset($product['brand']) && isset($product['brand']['name']) && isset($product['brand']['id'])) {
		    $doc->line_name_id_name_ss = $product ['brand'] ['id'] .'|'. $product ['brand'] ['name'];
		}
		
		$doc->category_name_ss = array_values ( $product ['category'] );
		$catIdName = array();
		if(is_array($product['category']))
		{
			foreach ($product ['category'] as $id=>$name){
				$catIdName[] = $id.'|'.$name;
			}
		}
		$doc->category_name_txt = array_values ( $product ['category'] );
		$doc->category_name_id_ss = $catIdName;
		$doc->is_feature_product_t = "no";
		if (isset ( $product['basic_information']['catalog_year'] ))
			$doc->catalog_year_s = $product['basic_information']['catalog_year'];

		/* Special Price Valid up to column of product handling started */
		$dateString = '';
		if(isset($product ['basic_information'] ['special_price_valid_up_to']) && $product ['basic_information'] ['special_price_valid_up_to'] != ''){
			$dateArray = explode("-",$product ['basic_information'] ['special_price_valid_up_to']);
			$dateString = $dateArray[2]."-".$dateArray[0]."-".$dateArray[1]."T23:59:59Z";
		}
		if($dateString == '' || $dateString == '1999-11-30T23:59:59Z')
		{
			$dateString = '2037-12-31T23:59:59Z';
		}
		$doc->price_valid_until_s= $dateString;
		/* Special Price Valid up to column of product handling ended */		
		
		/* Valid up to column of product handling started */
		$dateString = '';
		if(isset($product ['basic_information'] ['valid_up_to']) && $product ['basic_information'] ['valid_up_to'] != ''){			
			$dateArray = explode("-",$product ['basic_information'] ['valid_up_to']);
			$dateString = $dateArray[2]."-".$dateArray[0]."-".$dateArray[1]."T23:59:59Z";			
		}
		if($dateString == '' || $dateString == '1999-11-30T23:59:59Z')
		{			
			$dateString = '2037-12-31T23:59:59Z';		
		}
		$doc->valid_up_to_dt = $dateString;
		/* Valid up to column of product handling ended */
		
		$doc->price_currency_s = $product ['currency'] ['currency'];
		$doc->post_name_s = $product ['basic_information'] ['slug'];

		if (isset ( $product ['supplier'] ['pppc_member_number'] ))
			$doc->pppc_member_number_s = $product ['supplier'] ['pppc_member_number'];

		$doc->custom_sort_order_i = $product ['custom_sort_order'];

		if (isset ( $product ['prioritize_supplier_order'] )) {
			$doc->prioritize_supplier_order_is = $product ['prioritize_supplier_order'];
		}
		$this->setprioritizesupplier($doc,$product ['supplier'] ['supplier_id']);
		$this->setProductMappingTag ( $doc, $product );

		$this->insertPrioritizeField ( $doc, $product );
// 		echo '<pre>'; print_r($doc->fob_city_state);
// 		echo '----------------------#########################################';
// 		\Doctrine\Common\Util\Debug::dump($doc);
// 		die;
		// TODO - end added for promocan
 $update -> addDocument($doc);

if ($commit) {
  $update -> addCommit();
  ($this -> searchClient -> update($update));
}
}

    public function setprioritizesupplier($doc, $supplierId)
    {
    	$this->supplierQueue = $this->entitymanager->getRepository('OfficeBrainPrioritizeSupplierBundle:PrioritizeSupplier')->findSupplierPrioritizeById($supplierId);
//     	echo "<pre>";print_r($this->supplierQueue[0]->getUser()->getId());exit;
//     	echo "<pre>";print_r($this->supplierQueue[0]->getUser()->getId());exit;
//     	echo "<pre>";print_r($this->supplierQueue[0]->getSupplier()->getId());exit;
    	if(count($this->supplierQueue)){
	    	foreach ($this->supplierQueue as $queue){
	    		$suppQueue = "prioritize_supplier_".$queue->getUser()->getId()."_i";
	    		$doc->$suppQueue = $queue->getSupplierOrder();
	    	}
    	}
    	
    }
    public function setProductPriceMapping($doc, $priceQtyRanges,$serviceGroupId='')
    {    	 
        if($serviceGroupId>0)$serviceGroupId=$serviceGroupId."_";
        if(isset($priceQtyRanges) && is_array($priceQtyRanges) && (!(empty($priceQtyRanges))))
        {
	        foreach ( $priceQtyRanges as $key => $priceQtyRange ) {
	            if (($key + 1) <= $this->priceQtyRange) {
	                $minQty = 'min_qty_'.$serviceGroupId . ($key + 1) . '_i';
	                $coded_minQty = 'coded_min_qty_'.$serviceGroupId . ($key + 1) . '_i';
	                $maxQty = 'max_qty_'.$serviceGroupId . ($key + 1) . '_i';
	                $coded_maxQty = 'coded_max_qty_'.$serviceGroupId . ($key + 1) . '_i';
	                $price = 'price_'.$serviceGroupId . ($key + 1) . '_f';
	                $coded_price = 'coded_price_'.$serviceGroupId . ($key + 1) . '_f';
	                $code = 'code_' .$serviceGroupId . ($key + 1) . '_s';
	                $coded_code = 'coded_code_' .$serviceGroupId . ($key + 1) . '_s';
	                $doc->$minQty = $priceQtyRange ['minQty'];
	                $doc->$coded_minQty = $priceQtyRange ['minQty'];
	                $doc->$maxQty = $priceQtyRange ['maxQty'];
	                $doc->$coded_maxQty = $priceQtyRange ['maxQty'];
	                $doc->$price = $priceQtyRange ['price'];
	                $doc->$coded_price = $this->applyDiscountCode($priceQtyRange ['price'],$priceQtyRange ['code']);
	                $doc->$code = $priceQtyRange ['code'];
	                $doc->$coded_code = $priceQtyRange ['code'];
	            }
	        }
        }
    }

    public function setProductGroupPriceMapping($doc, $product)
    {
          // / according to defualt $product->priceQtyRanges set range for data.
        if (isset ( $product ['productGroupPriceQtyRanges'] ) && count( $product ['productGroupPriceQtyRanges'] )>0 && count ( $this->priceQtyRange ) > 0) {
            foreach ($product['productGroupPriceQtyRanges'] as $key => $value) {
            	
                $this->setProductPriceMapping($doc, (isset($value ['priceQtyRanges'])?$value ['priceQtyRanges']:''),$key);
                $minCodeForThisIteration = '';
                $maxCodeForThisIteration = '';
                // Find minimum quantity code for this range
                if(isset($value ['priceQtyRanges']) && is_array($value ['priceQtyRanges']) && (!(empty($value ['priceQtyRanges']))))
                {
	                foreach($value ['priceQtyRanges'] as $key2 => $data2)
	                {
	                	if(isset($data2) && isset($data2['price']) && $data2['price'] == $value['min_price'])
	                	{
	                		$minCodeForThisIteration = $data2['code'];
	                	}
	                	if(isset($data2) && isset($data2['price']) && $data2['price'] == $value['max_price'])
	                	{
	                		$maxCodeForThisIteration = $data2['code'];
	                	}
	                }
                }
                
                if(!empty($value['group_expired_date']))
                {
                    $doc->{"group_expired_date_".$key."_s"}=$value['group_expired_date'];
                    $doc->{"coded_group_expired_date_".$key."_s"}=$value['group_expired_date'];
                }
                $doc->{"min_quantity_".$key."_i"}=$value['min_qty'];
                $doc->{"coded_min_quantity_".$key."_i"}=$value['min_qty'];
                $doc->{"max_quantity_".$key."_i"}=$value['max_qty'];
                $doc->{"coded_max_quantity_".$key."_i"}=$value['max_qty'];
                $doc->{"min_price_".$key."_f"}=$value['min_price'];
                $doc->{"min_code_".$key."_s"}=$minCodeForThisIteration;
                $doc->{"coded_min_price_".$key."_f"}=$this->applyDiscountCode($value['min_price'],$minCodeForThisIteration);
                $doc->{"max_price_".$key."_f"}=$value['max_price'];
                $doc->{"max_code_".$key."_s"}=$maxCodeForThisIteration;
                $doc->{"coded_max_price_".$key."_f"}=$this->applyDiscountCode($value['max_price'],$maxCodeForThisIteration);
            }
        }
    }

public function setProductMappingTag($doc, $product) {
$customCategoryId = array ();
$featureProductId = array ();
if (isset ( $product ['product_tag'] ) && is_array ( $product ['product_tag'] )) {
			foreach ( $product ['product_tag'] as $productTagData ) {
				foreach ( $productTagData as $productTag ) {
					// if tag type id is 1 than
					if ($productTag ['tag_type_id'] == 1) {
						$featureProductId [] = $productTag ['tag_id'];
					} else {
						$customCategoryId [] = $productTag ['tag_id'];
					}
				}
			}
		}
		$doc->product_tag_is = $featureProductId;
		$doc->custom_category_id_is = $customCategoryId;
	}

	/**
	 * update commit batch or not.
	 *
	 * @param boolean $update
	 */
	public function commitBatch($update) {
		$update->addCommit ();
		$result = $this->searchClient->update ( $update );
	}

	/**
	 * delete index
	 *
	 * @param object $update
	 * @param string $commit
	 */
	public function deleteIndex($update, $commit = true) {
		$min = 0;
		$max = 100000;
		$range = range ( $min, $max );

		foreach ( $range as $key => $value ) {
			// add the delete id and a commit command to the update query
			$update->addDeleteById ( $key );
		}

		$update->addCommit ();

		// this executes the query and returns the result
		$this->searchClient->update ( $update );
	}

	/**
	 * set search client
	 *
	 * @param string $culture
	 */
	public function setSearchClient($culture) {
		$this->searchClient = $this->clientFactoryService->getProductSearchClientInstance ( $culture );
	}

	public function myCurrentCountryPricePrefix()
	{
		$oldLocale=$this->getSearchCulture();
		$newLocale= isset($_COOKIE["CUSTOM_SITE_CULTURE"])?$_COOKIE["CUSTOM_SITE_CULTURE"]:'en_us';
		$myCurrentCountry = '';
		$country = (isset($newLocale) && $newLocale!=null)?$newLocale:$oldLocale;
		
		//     	if((!isset($caMinPrice) || $caMinPrice== null) && $newLocale == 'en_ca')
			//     	{
			//     		$country = 'en_us';
			//     	}
				
			$newCountry =explode("_",$country);
			
			if(isset($newCountry[1]))
				$myCurrentCountry=$newCountry[1];
				else
					$myCurrentCountry='us';
				
		$pricePrefix = 'us_';
		if(isset($myCurrentCountry) && $myCurrentCountry=='ca')
		{
			$pricePrefix = $myCurrentCountry.'_';
		}
		if(isset($myCurrentCountry) && $myCurrentCountry=='us')
		{
			$pricePrefix = $myCurrentCountry.'_';
		}
		return $pricePrefix;
	}
	
	/**
	 * filter product solr query
	 *
	 * @param SolrQuery $query
	 *        	solr query instance
	 * @param array $criteria
	 *        	criteria array
	 *
	 * @return unknown
	 */
	// change parameter name for : Price Range sorting with configuration : $priceRangeSorting
	public function filterProduct($query, $criteria, $showAllRecords=false,$serviceGroupId = null,$priceRangeSorting = null) 
	{

		$pricePrefix= $this->myCurrentCountryPricePrefix();
		//$this->serviceContainer->get('office_brain_core_manager')->showReferer();exit;
// 		{% if row.ca_min_price is defined and row.ca_min_price != null and currentCountry=='ca' %}
// 		{% set pricePrefix = 'ca_'~prefix %}
// 		{% endif %}
// 		{% if row.us_min_price is defined and row.us_min_price != null and currentCountry=='us' %}
// 		{% set pricePrefix = 'us_'~prefix %}
// 		{% endif %}
		if(isset($criteria['min_price']))
		{
			$criteria[$pricePrefix.'coded_min_price'] = $criteria['min_price'];
			$criteria[$pricePrefix.'min_price'] = $criteria['min_price'];
		}
		if(isset($criteria['max_price']))
		{
			$criteria[$pricePrefix.'coded_max_price'] = $criteria['max_price'];
			$criteria[$pricePrefix.'max_price'] = $criteria['max_price'];
		}
		
		$filters = array ();
		
		/* Expired Products Should not be displayed in search */
		
		/* 
		$todaysDate = date("Y-m-d\TH:i:s\Z");
		$query->createFilterQuery ( 'noExpiredProductsQuery' )->setQuery ( 'valid_up_to_dt: ['.$todaysDate.' TO *]' );
		*/


		/* Expired Products Should not be displayed in search */
		
		/* unset($criteria['em']);
		echo "Criteria:<pre>";print_r(array_keys($criteria));die; */
		
		// we are not going to load filter product by default
		//echo '<pre>'; print_r($criteria['color_mapping']); die;
		
		//echo "<br/><br/>inactiveCategoryId: ";
		//print_r($criteria ['inactive_category_id']); die;
		if (isset ( $criteria ['inactive_category_id'] ) && count ( $criteria ['inactive_category_id'] )) {
			$catStr = implode ( ' OR ', $criteria ['inactive_category_id'] );
			$catStr = "(" . $catStr . ")";
			//$filters [] = '-(inactive_category_id_ss:' . $catStr.')';
			$filters [] = 'inactive_category_id_ss:' . $catStr;
			//print_r($filters); die;
		}

		/*echo "<br/><br/>Category Id Not: ";
		print_r($criteria ['category_id_not']);
		
		echo "<br/><br/>Product Id Not: ";
		//print_r($criteria ['product_id_not']);
		
		echo "<br/><br/>Tag Not: ";
		//print_r($criteria ['tag_not']);*/

		//echo get_class($query);die;
		if (isset ( $criteria ['isFeature'] ) && $criteria ['isFeature'] == 'yes') {
			$query->createFilterQuery ( 'noFeatureProduct' )->setQuery ( 'is_feature_product_t:"yes"' );
		} else {
			$query->createFilterQuery ( 'noFeatureProduct' )->setQuery ( 'is_feature_product_t:"no"' );
		}

		if (isset ( $criteria ['country'] )) {

			$ctrStr = implode ( ' OR ', $criteria ['country'] );

			if (count ( $criteria ['country'] ) > 1) {
				$ctrStr = "(" . $ctrStr . ")";
			}

			$filters [] = 'country_ss:' . $ctrStr;
		}
// 		if (isset ( $criteria ['category_id'] ) && count ( $criteria ['category_id'] )) {
// 			$catStr = implode ( ' OR ', $criteria ['category_id'] );
// 			$catStr = "(" . $catStr . ")";
// 			$filters [] = 'category_is:' . $catStr;
// 		}
		// Index from category_tag_id to tag_category_id changed by 4248 - Nishant
		
		/* Negative Conditions Started */
		//echo '<pre>'; print_r($criteria ['display_campaign_product']); die;
		if (isset ( $criteria ['campaign_id'] ) && count ( $criteria ['campaign_id'] )) {
			//echo '11111111'; die;
			$campStr = implode ( ' OR ', $criteria ['campaign_id'] );
			$campStr= "(" . $campStr. ")";
			$filters [] = '(custom_campaigns_is:' . $campStr.')';
		}else{
			if(isset ( $criteria ['display_campaign_product'] ) &&  ( $criteria ['display_campaign_product'] == 0 )){
				//$filters[] = '!custom_campaigns_is:[* TO *]';
				//$filters[] = '!private_custom_is_show_campaign_t:no';
			}
		}
		//echo '<pre>'; print_r($filters); die;
		if (isset ( $criteria ['category_tag_id_not'] ) && count ( $criteria ['category_tag_id_not'] )) {
			$criteria ['category_tag_id_not'] = array_unique($criteria ['category_tag_id_not']);
			if (isset ( $criteria ['category_id_not'] ) && count ( $criteria ['category_id_not'] )) {
				$catStrTag = implode ( ' OR ', $criteria ['category_tag_id_not'] );
				$catStrTag = "(" . $catStrTag . ")";
		
				$catStr = implode ( ' OR ', $criteria ['category_id_not'] );
				$catStr = "(".$catStrTag."AND(" . $catStr . "))";
				$filters [] = '-(category_is:' . $catStr.')';
			}else{
		
				$catStr = implode ( ' OR ', $criteria ['category_tag_id_not'] );
				$catStr = "(" . $catStr . ")";
				$filters [] = '-(category_is:' . $catStr.')';
		
			}
		}else{
			if (isset ( $criteria ['category_id_not'] ) && count ( $criteria ['category_id_not'] )) {
				$catStr = implode ( ' OR ', $criteria ['category_id_not'] );
				$catStr = "(" . $catStr . ")";
				$filters [] = '-(category_is:' . $catStr.')';
			}
		}
		
		if (isset ( $criteria ['product_id_not'] ) && count ( $criteria ['product_id_not'] )) {
			$productIdStr = implode ( ' OR ', $criteria ['product_id_not'] );
			$productIdStr = "(" . $productIdStr . ")";
			$filters [] = '-(product_id_i:' . $productIdStr.')';
		}
		
		if (isset ( $criteria ['category_tag_not'] ) && count ( $criteria ['category_tag_not'] )) {
			$criteria ['category_tag_not'] = array_unique($criteria ['category_tag_not']);
				
			if (isset ( $criteria ['tag_not'] ) && count ( $criteria ['tag_not'] )) {
				//$criteria ['tag_not'] = array_unique($criteria ['tag_not']);
		
				$catStrTag = implode ( ' OR ', $criteria ['category_tag_not'] );
				$catStrTag = "(" . $catStrTag . ")";
		
				$catStr = implode ( ' OR ', $criteria ['tag_not'] );
				$catStr = "(".$catStrTag."AND(" . $catStr . "))";
		
				$filters [] = '-(public_custom_tag_ss:' . $catStr.') AND -(private_custom_tag_ss:' . $catStr.')';
			}else{
				$catStr = implode ( ' OR ', $criteria ['category_tag_not'] );
				$catStr = "(" . $catStr . ")";
				$filters [] = '-(public_custom_tag_ss:' . $catStr.') AND -(private_custom_tag_ss:' . $catStr.')';
		
			}
		}else{
			if (isset ( $criteria ['tag_not'] ) && count ( $criteria ['tag_not'] )) {
				$catStr = implode ( ' OR ', $criteria ['tag_not'] );
				$catStr = "(" . $catStr . ")";
				$filters [] = '-(public_custom_tag_ss:' . $catStr.') AND -(private_custom_tag_ss:' . $catStr.')';
			}
		}
		/* Negative Conditions Ended */
		
		if (isset ( $criteria ['category_tag_id'] ) && count ( $criteria ['category_tag_id'] )) {
			$criteria ['category_tag_id'] = array_unique($criteria ['category_tag_id']);
			if (isset ( $criteria ['category_id'] ) && count ( $criteria ['category_id'] )) {
				$catStrTag = implode ( ' OR ', $criteria ['category_tag_id'] );
				$catStrTag = "(" . $catStrTag . ")";

				$catStr = implode ( ' OR ', $criteria ['category_id'] );
				$catStr = "(".$catStrTag."AND(" . $catStr . "))";
				$filters [] = 'category_is:' . $catStr;
			}else{

				$catStr = implode ( ' OR ', $criteria ['category_tag_id'] );
				$catStr = "(" . $catStr . ")";
				$filters [] = 'category_is:' . $catStr;

			}
		}else{
			if (isset ( $criteria ['category_id'] ) && count ( $criteria ['category_id'] )) {
				$catStr = implode ( ' OR ', $criteria ['category_id'] );
				$catStr = "(" . $catStr . ")";
				$filters [] = 'category_is:' . $catStr;
			}
		}

		if (isset ( $criteria ['color_mapping'] ) && count ( $criteria ['color_mapping'] )) {
// 			$catStr = implode ( ' OR ', $criteria ['color_mapping'] );
// 			$catStr = "(" . $catStr . ")";
// 			$filters [] = 'color_mapping_search:' . $catStr;
			
			$catStr = implode ( '" OR color_mapping_search:"', $criteria ['color_mapping'] );
			$catStr = '( color_mapping_search:"' . $catStr.'" )' ;
			$filters [] = $catStr;
		}
		//echo '<pre>'; print_r($filters); die;
		if (isset ( $criteria ['custom_category_id'] ) && count ( $criteria ['custom_category_id'] )) {
			$catStr = implode ( ' OR ', $criteria ['custom_category_id'] );
			$catStr = "(" . $catStr . ")";
			$filters [] = 'custom_category_id_is:' . $catStr;
		}
		if (isset ( $criteria ['quote_search'] ) && $criteria ['quote_search']=='yes' ) {
			
			$filters [] = 'quote_s:yes';
			$filters [] = 'distributor_id_s:'.$criteria ['supplier_id'];
		}else{
			//$filters [] = '-quote_s:no';
		}
		
		if (isset ( $criteria ['product_id'] )) {
			if (is_array($criteria['product_id']) && count($criteria['product_id'])) {
			$productIdStr = is_array($criteria ['product_id']) ? implode ( ' OR ', $criteria ['product_id'] ) : $criteria ['product_id'];
			$productIdStr = "(" . $productIdStr . ")";
			$filters [] = 'product_id_i:' . $productIdStr;
			}
			//print_r($filters); die;
		}
		
		if (isset ( $criteria ['related_product_ids'] ) && count ( $criteria ['related_product_ids'] )) {
		    $relatedProductIdStr = implode ( ' OR ', $criteria ['related_product_ids'] );
		    $relatedProductIdStr = "(" . $relatedProductIdStr . ")";
		    $filters [] = 'product_id_i:' . $relatedProductIdStr;
		}
		
		if (isset ( $criteria ['recent_product_ids'] ) && count ( $criteria ['recent_product_ids'] )) {
		    $recentProductIdStr = implode ( ' OR ', $criteria ['recent_product_ids'] );
		    $recentProductIdStr = "(" . $recentProductIdStr . ")";
		    $filters [] = 'product_id_i:' . $recentProductIdStr;
		}

		if (empty ( $criteria ['search_type'] )) {
			$criteria ['search_type'] = 'exact';
		}

		// print_r($criteria ['search_type']);exit;
		if (isset ( $criteria ['sku'] )) {
			if (is_array ( $criteria ['sku'] )) {
				$criteria ['sku'] = implode ( ' OR ', $criteria ['sku'] );
			}
			// Changed the SKU Filter Logic
			switch ($criteria ['search_type']) {
				case 'all' :
					//$filters [] = 'sku:("' . str_replace ( ',', '" OR "', str_replace ( ' ', '" AND "', addslashes ( $criteria ['sku'] ) ) ) . '")';
					$filters [] = 'sku_t:("' . str_replace ( ',', '" OR "', addslashes ( $criteria ['sku'] )  ) . '")';
					//$filters [] = '(sku:("' . str_replace ( ',', '" OR "', addslashes ( $criteria ['sku'] ) ) . '") OR original_sku_number_s:("' . str_replace ( ',', '" OR "', addslashes ( $criteria ['sku'] ) ) . '"))';
					break;
				case 'exact' :
					//$filters [] = 'sku_exact:("' . addslashes ( $criteria ['sku'] ) . '")'; // origianl line commented because in solr sku_exact is not exsits
					$filters [] = 'sku_t:("' . addslashes ( $criteria ['sku'] ) . '")';
					break;
				case 'any' :
					$filters [] = 'sku:("' . str_replace ( ' ', '" OR "', addslashes ( $criteria ['sku'] ) ) . '")';
					break;
			}
		}
		

		if (isset ( $criteria ['supplier_id'] ) && count ( $criteria ['supplier_id'] )) {
			$catStr = implode ( ' OR ', $criteria ['supplier_id'] );
			$catStr = "(" . $catStr . ")";
			$filters [] = 'supplier_id_i:' . $catStr;
		}
		
		/* Pass criteria for original supplier id in query */
		/* if (isset ( $criteria['original_supplier_id'] )) {
		
			$filters [] = 'original_supplier_id_i:' . $criteria['original_supplier_id'];
		} */
		if (isset ( $criteria ['line_name_id'] ) && count ( $criteria ['line_name_id'] )) {
			$catStr = implode ( ' OR ', $criteria ['line_name_id'] );
			$catStr = "(" . $catStr . ")";
			$filters [] = 'line_name_id_i:' . $catStr;
		}

		if (isset ( $criteria ['brand_id'] )) {
			$catStr = implode ( ' OR ', $criteria ['brand_id'][0] );
			$catStr = "(" . $catStr . ")";
			$filters [] = 'line_name_id_i:' . $catStr;
		}
		
		/** Size Filter **/
		if (isset ( $criteria ['size_id'] ) && count ( $criteria ['size_id'] )) {
			$catStr = implode ( ' OR ', $criteria ['size_id'] );
			$catStr = "(" . $catStr . ")";
			$filters [] = 'size_id_is:' . $catStr;
		}
		
		/** Ink Filter **/
		if (isset ( $criteria ['ink_id'] ) && count ( $criteria ['ink_id'] )) {
			$catStr = implode ( ' OR ', $criteria ['ink_id'] );
			$catStr = "(" . $catStr . ")";
			$filters [] = 'ink_id_is:' . $catStr;
		}
		
		/**Production Time Filter **/
		if (isset ( $criteria ['production_time_id'] )) {
// 			$catStr = str_replace(array('"','-',","),array(""," TO ","] OR ["),$criteria ['production_time_id']);
			$catStr = implode ( ' OR ', $criteria ['production_time_id'] );
			$catStr = "(" . $catStr . ")";
			$filters [] = 'production_time_unit_ss:' . $catStr;
		} 
		
		/** FOB Filter **/
		if (isset ( $criteria ['fob_id'] )) {
			$catStr = implode ( ' OR ', $criteria ['fob_id'] );
			$catStr = "(" . $catStr . ")";
			$filters [] = 'fob_city_state_ss:' . $catStr;
		}
		
		if (isset ( $criteria['similar_sku'] )) {

		    $filters [] = 'sku_t:*' . $criteria['similar_sku'];
		}

// 		if (isset ( $criteria ['tag'] )) {
// 			//		  $filters [] = 'product_tag_is:' . $criteria ['tag'];
// 			$catStr = implode ( ' OR ', $criteria ['tag'] );
// 			$catStr = "(" . $catStr . ")";
// 			$filters [] = '(public_custom_tag_ss:' . $catStr . ' OR private_custom_tag_ss:' . $catStr.')';

// 		}

		if (isset ( $criteria ['category_tag'] ) && count ( $criteria ['category_tag'] )) {
			$criteria ['category_tag'] = array_unique($criteria ['category_tag']);
			if (isset ( $criteria ['tag'] ) && count ( $criteria ['tag'] )) {
				$catStrTag = implode ( ' OR ', $criteria ['category_tag'] );
				$catStrTag = "(" . $catStrTag . ")";

				$catStr = implode ( ' OR ', $criteria ['tag'] );
				$catStr = "(".$catStrTag."AND(" . $catStr . "))";
				$filters [] = '((public_custom_tag_ss:' . $catStr . ' )OR (private_custom_tag_ss:' . $catStr.'))';
			}else{
				$catStr = implode ( ' OR ', $criteria ['category_tag'] );
				$catStr = "(" . $catStr . ")";
				$filters [] = '(public_custom_tag_ss:' . $catStr . ' OR private_custom_tag_ss:' . $catStr.')';

			}
		}else{
		if (isset ( $criteria ['tag'] ) && count ( $criteria ['tag'] )) {
				$catStr = implode ( ' OR ', $criteria ['tag'] );
				$catStr = "(" . $catStr . ")";
				$filters [] = '(public_custom_tag_ss:' . $catStr . ' OR private_custom_tag_ss:' . $catStr.')';
			}
		}
		// start added for promocan
		if (isset ( $criteria ['price_valid_until'] ) && count ( $criteria ['price_valid_until'] )) {

			$catStr = implode ( ' OR ', $criteria ['price_valid_until'] );
			$catStr = "(" . $catStr . ")";
			$filters [] = 'price_valid_until_s:' . $catStr;
			unset($catStr);
		}
		if (isset ( $criteria ['catalog_year'] ) && count ( $criteria ['catalog_year'] )) {
		//if (isset ( $criteria ['catalog_year'] )) {
			$catStr = implode ( ' OR ', $criteria ['catalog_year'] );
			$catStr = "(" . $catStr . ")";
			$filters [] = 'catalog_year_s:' . $catStr;
		}
		if (isset ( $criteria ['price_currency'] )) {
			//$catStr = implode ( ' OR ', $criteria ['price_currency'] );
			//$catStr = "(" . $catStr . ")";
			$filters [] = 'price_currency_s: "' . $criteria ['price_currency'].'"';
		}
		if (isset ( $criteria ['line_name'] )) {
			$filters [] = 'line_name_t:("' . addslashes ( $criteria ['line_name'] ) . '")';
		}
		if (isset ( $criteria ['category_name'] )) {
			if(is_array($criteria ['category_name'])){
				$catStr = implode ( ' OR ', $criteria ['category_name'] );
				$catStr = "(" . $catStr . ")";
				$filters [] = 'category_name:' . $catStr;
				unset($catStr);
			}
			else{
				$filters [] = 'category_name_txt:("' . addslashes ( $criteria ['category_name'] ) . '")';
			}
		}
		if (isset ( $criteria ['supplier_name'] )) {
			$catStr = implode ( "' OR '",$criteria ['supplier_name']);
			$catStr = "(\"" . $catStr . "\")";
			$filters [] = 'supplier_t:' . $catStr;
			unset($catStr);
		}
		if (isset ( $criteria ['post_name'] )) {
			$filters [] = 'post_name_s:("' . addslashes ( $criteria ['post_name'] ) . '")';
		}
		if (isset ( $criteria ['rating'] )) {
			if($criteria ['rating'] == 0){
				$filters [] = 'rating_f: "' .  $criteria ['rating']  . '"';
			}else{
				$filters [] = 'rating_f:[' .  $criteria ['rating']  . ' TO * ]';
			}
		}
		
		if (isset ( $criteria ['keyword'] )) {

			$keywordStr = "";
			$tmpKeyWord = addslashes ( $criteria ['keyword'] );
			$disMax = $query->getEDisMax ();
			$baseSearchMark = 100;
			$releavancyScore = array (
					'title_t',
					'keyword_txt','color_mapping_search' /*,'sku_t','category_name_ss','supplier_s','line_name_t'*/);
			$boostQuery = "(";
			$disMax->setPhraseFields ( 'title_t category_name_ss supplier_s line_name_t color_mapping_search size_ss ink_ss' );
			$disMax->setPhraseSlop ( 0 );
			$criteria ['search_type']="any";
			switch ($criteria ['search_type']) {
				case 'all' :
					$tmpSearchKeyword = explode ( ' ', $tmpKeyWord );

					foreach ( $releavancyScore as $key => $releavancyField ) {
						foreach ( $tmpSearchKeyword as $searchKeyword ) {
							$boostQuery .= $releavancyField . ':("' . $searchKeyword . '")^' . ceil ( $baseSearchMark / (($key + 1)) ) . ' AND ';
						}
					}
					$boostQuery = trim ( $boostQuery, ' AND ' ) . ')';
					$tmpKeyWord = '("' . str_replace ( ' ', '" AND "', $tmpKeyWord ) . '")';
					$keywordStr = $tmpKeyWord;
					$disMax->setBoostQuery ( $boostQuery );

					break;
				case 'exact' :
					$tmpKeyWord = '("' . $tmpKeyWord . '")';
					$boostQuery = "(";
					foreach ( $releavancyScore as $key => $releavancyField ) {
						$boostQuery .= $releavancyField . ':(' . $tmpKeyWord . ')^' . ceil ( $baseSearchMark / ($key + 1) ) . ' ';
					}
					$boostQuery = $boostQuery . ')';
					$keywordStr = $tmpKeyWord;
					$disMax->setBoostQuery ( $boostQuery );
					break;
				case 'any' :
					$tmpSearchKeyword = explode ( ' ', $tmpKeyWord );
					$boostQuery = "(";
					foreach ( $releavancyScore as $key => $releavancyField ) {
						foreach ( $tmpSearchKeyword as $searchKeyword ) {
							$boostQuery .= $releavancyField . ':("' . $searchKeyword . '")^' . ceil ( $baseSearchMark / ($key + 1) ) . ' OR ';
						}
					}
					$boostQuery = trim ( $boostQuery, ' OR ' ) . ')';

					//$tmpKeyWord = "(*{$tmpKeyWord}* OR *{$tmpKeyWord}s*)";
					//$tmpKeyWord = '(*' . str_replace ( ' ', ' OR ', $tmpKeyWord ) . '*)';
					$tmpKeyWord = '(' . str_replace ( ' ', ' OR ', $tmpKeyWord ) . ')';
					$keywordStr = $tmpKeyWord;

					$disMax->setBoostQuery ( $boostQuery );
					break;
			}

			$filters [] = '(keyword_txt:'.$keywordStr.')';
// 			$filters [] = '((keyword_txt:'.$keywordStr.')or(color_mapping_search:'.$keywordStr.'))';

		} //echo $keywordStr,":<pre>";print_r($filters);exit;
// 		if (isset ( $criteria ['attribute'] ) && count ( $criteria ['attribute'] )) {
// 			$attributeArray = array_unique($criteria ['attribute']);
// 			$attStr = implode ( '" OR "', $attributeArray );
// 			$attStr = '("' . $attStr . '")';
// 			$filters [] = '(attribute_ss:' . $attStr .' OR color_ss:' . $attStr . ')';
// 			//$filters [] = 'color_ss:' . $attStr;
// 		}
		//echo '<pre>'; print_r($filters); die;
		if (isset ( $criteria ['all_tag'] )) {
			$filters [] = '(custom_category_id_is:* OR product_tag_is:*)';
		}
		// add a price filter
		if(isset($this->user) && is_object($this->user) && (!(empty($this->user))) && $this->user->getId()>0 )
		{
			$this->addCodedPriceFilter ( $filters, $criteria );
		}
		else
		{
			$this->addPriceFilter ( $filters, $criteria );
		}

		/* Modified By Emp Id: 4589
		 * Add main_search_type for rule filter
		 * Replace AND with main_search_type, default value AND
		 */
		if(!isset($criteria['main_search_type']) || in_array($criteria['main_search_type'],array("AND","OR"))){
			$criteria['main_search_type'] = "AND";
		}
		if(isset ($criteria['instance_id'])){
			$filters [] = 'instance_id_i:'.$criteria['instance_id'];
		}
		$filtersStr = implode ( ' '.$criteria['main_search_type'].' ', $filters );
        //echo '<pre>'; print_r($filtersStr); die;
		/*
		 * END Emp Id: 4589
		 */
		$query->createFilterQuery ( 'search_product' )->setQuery ( $filtersStr );
		//$query->createFilterQuery ( 'search_product' )->setQuery ( '{!child of="content_type_txt:parentDocument"}title_txt:lucene AND '.$filtersStr );
		if(isset($tmpKeyWord)){
		$hl = $query->getHighlighting();
		$hl->setQuery('color_search_image:'.$tmpKeyWord);
		$hl->setFields('color_search_image');
		$hl->setSimplePrefix('');
		$hl->setSimplePostfix('');
		}
		// /Adding Filteration logic
		$postPrioritizationAllowField = array (
				'price_currency',
				'base_price'
		);
		
		//echo '<pre>'; print_r($filters); die;
		//echo '<pre>test'; print_r($criteria ['sort']); die;
		if (isset ( $criteria ['sort'] ) && count ( $criteria ['sort'] )) {
			$sortField = $criteria ['sort'] ['field'];
			$sortOrder = (strtoupper($criteria ['sort'] ['order']) == 'DESC') ? 'SORT_DESC' : 'SORT_ASC';
			// /For Pre priorization allow field
			if (isset ( $criteria ['distributor_id'] ) && ! in_array ( $sortField, $postPrioritizationAllowField )) {
				// TODO please remove below code to enable priortize suppler order.
				// $this->addPrioritizeSupplierSortOrder ( $query, $criteria ['distributor_id'] );
			}
			//$query->addSort('custom_sort_order_i', $query::SORT_ASC);
			//echo $sortField; die;
			if($sortField == 'original_sku_number')
            {
                if ($sortOrder == 'SORT_DESC')
                    $query->addSort ( 'original_sku_number_s', $query::SORT_DESC);
                    else
                        $query->addSort ( 'original_sku_number_s', $query::SORT_ASC);
            }
			if ($sortField == 'custom_sort') {
				$query->addSort('custom_sort_order_i', $query::SORT_ASC);
			}
			if ($sortField == 'bestseller') {
				
				$query->addSort('private_custom_tag_sort_i', $query::SORT_DESC);
				
				// Update if condition for : Price Range sorting with configuration
				if(isset($this->user) && is_object($this->user) && (!(empty($this->user))) && $this->user->getId()>0 )
				{
					$query->addSort ( $pricePrefix.'coded_min_price_f', $query::SORT_ASC); // min price sorting
				}
				else
				{
					$query->addSort ( $pricePrefix.'min_price_f', $query::SORT_ASC); // min price sorting
				}
				
				//$query->addSort ( 'custom_sort_order_i', $query::SORT_ASC );
			//	$query->addSort ( 'title_s', $query::SORT_ASC );
				$query->addSort ( 'score', $query::SORT_DESC ); // relevancy wise sorting
			}
			if ($sortField == 'line_name') {
				// $query->addSort('price_currency_s', $query::SORT_ASC);
				//$query->addSort('call_for_price_s', $query::SORT_ASC);
				//$query->addSort ( 'custom_sort_order_i', $query::SORT_ASC );
				if ($sortOrder == 'SORT_DESC') {
					$query->addSort ( 'line_name_s', $query::SORT_DESC );
				} else {
					$query->addSort ( 'line_name_s', $query::SORT_ASC );
				}
				$query->addSort ( 'score', $query::SORT_DESC ); // relevancy wise sorting
			}
			//echo $sortField.'----->'.$sortOrder; die;
			if ($sortField == 'price_currency') {
				if ($sortOrder == 'SORT_DESC') {
					$query->addSort ( 'price_currency_s', $query::SORT_DESC );
				} else {
					$query->addSort ( 'price_currency_s', $query::SORT_ASC );
				}
				//$query->addSort ( 'call_for_price_s', $query::SORT_ASC );
				$query->addSort ( 'score', $query::SORT_DESC ); // relevancy wise sorting
			}

			if ($sortField == 'title') {
				// $query->addSort('price_currency_s', $query::SORT_ASC);
				//$query->addSort('call_for_price_s', $query::SORT_ASC);
				//$query->addSort ( 'custom_sort_order_i', $query::SORT_ASC );
				if ($sortOrder == 'SORT_DESC') {
					$query->addSort ( 'title_s', $query::SORT_DESC );
				} else {
					$query->addSort ( 'title_s', $query::SORT_ASC );
				}
				$query->addSort ( 'score', $query::SORT_DESC ); // relevancy wise sorting
			}

			if ($sortField == 'sku') {
				// $query->addSort('price_currency_s', $query::SORT_ASC);
				//$query->addSort('call_for_price_s', $query::SORT_ASC);
				//$query->addSort ( 'custom_sort_order_i', $query::SORT_ASC );
				if ($sortOrder == 'SORT_DESC') {
					$query->addSort ( 'sku_t', $query::SORT_DESC );
				} else {
					$query->addSort ( 'sku_t', $query::SORT_ASC );
				}
// 				$query->addSort ( 'score', $query::SORT_DESC ); // relevancy wise sorting
			}

			if ($sortField == 'supplier_name') {
				// $query->addSort('price_currency_s', $query::SORT_ASC);
				//$query->addSort('call_for_price_s', $query::SORT_ASC);
				//$query->addSort ( 'custom_sort_order_i', $query::SORT_ASC );
				if ($sortOrder == 'SORT_DESC') {
					$query->addSort ( 'supplier_s', $query::SORT_DESC );
				} else {
					$query->addSort ( 'supplier_s', $query::SORT_ASC );
				}
				$query->addSort ( 'score', $query::SORT_DESC ); // relevancy wise sorting
			}

			if ($sortField == 'base_price') {
				// $query->addSort('price_currency_s', $query::SORT_ASC);
				//$query->addSort('call_for_price_s', $query::SORT_ASC);
				//$query->addSort ( 'custom_sort_order_i', $query::SORT_ASC );
				if ($sortOrder == 'SORT_DESC') {
					$query->addSort ( 'base_price_f', $query::SORT_DESC );
				} else {
					$query->addSort ( 'base_price_f', $query::SORT_ASC );
				}
				$query->addSort ( 'score', $query::SORT_DESC ); // relevancy wise sorting
			}

			// for price sort start
			if ($sortField == 'price') {
				//$query->addSort ( 'custom_sort_order_i', $query::SORT_ASC );
				//$query->addSort('call_for_price_s', $query::SORT_ASC);
                if($serviceGroupId == null){
                	$serviceGroupIdFlag = "";
                }
                else{
                	$serviceGroupIdFlag = $serviceGroupId."_";
                }
                $serviceGroupIdFlag = "";
               // unset($criteria['em']);
               // print_r($criteria);exit;
               
               // Update if condition for : Price Range sorting with configuration
                if(isset($this->user) && is_object($this->user) && (!(empty($this->user))) && $this->user->getId()>0 )
                {                	
	                if(isset($priceRangeSorting) && $priceRangeSorting==1 && ! isset ( $criteria ['quantity'] ))
	                {
	                	if ((isset ( $criteria [$pricePrefix.'coded_min_price'] ) || isset ( $criteria [$pricePrefix.'coded_max_price'] )) && ! isset ( $criteria ['quantity'] )) {
	                		$priceRangeSort = $this->addSortCodedPriceInRange($this->priceQtyRange,'',$criteria);
	                		//$priceRangeSort = "_val_:".$priceRangeSort;
	                		if ($sortOrder == 'SORT_DESC') {
	                			$query->addSort ( $priceRangeSort, $query::SORT_DESC ); // min price sorting
	                		} else {
	                			$query->addSort ( $priceRangeSort, $query::SORT_ASC ); // min price sorting
	                		}
	                	}
	                	// Sorting after applying quantity filter and shown price of that quantity : START
	                	if ($sortOrder == 'SORT_DESC') {
	                		$query->addSort ( $pricePrefix.'coded_min_price_'.$serviceGroupIdFlag.'f', $query::SORT_DESC ); // min price sorting
	                	} else {
	                		$query->addSort ( $pricePrefix.'coded_min_price_'.$serviceGroupIdFlag.'f', $query::SORT_ASC ); // min price sorting
	                	}
	                	// Sorting after applying quantity filter and shown price of that quantity : END
	                }
	                // Sorting after applying quantity filter and shown price of that quantity : START
	                else if ((isset ( $criteria [$pricePrefix.'coded_min_price'] ) || isset ( $criteria [$pricePrefix.'coded_max_price'] )) &&  isset ( $criteria ['quantity'] )) {
	                	$priceRangeSort = $this->addSortCodedPriceForQuantity($criteria);
	                	//$qtyReturnPrice = "_val_:".$priceRangeSort;
	                	//$selectFields = array($qtyReturnPrice);
	                	if ($sortOrder == 'SORT_DESC') {
	                		$query->addSort ( $priceRangeSort, $query::SORT_DESC ); // min price sorting
	                	} else {
	                		$query->addSort ( $priceRangeSort, $query::SORT_ASC ); // min price sorting
	                	}
	                }
	                // Sorting after applying quantity filter and shown price of that quantity : END
	                else{
	                	if ($sortOrder == 'SORT_DESC') {
	                		$query->addSort ( $pricePrefix.'coded_min_price_'.$serviceGroupIdFlag.'f', $query::SORT_DESC ); // min price sorting
	                	} else {
	                		$query->addSort ( $pricePrefix.'coded_min_price_'.$serviceGroupIdFlag.'f', $query::SORT_ASC ); // min price sorting
	                	}
	                }
                }
                else
                {                
	                if(isset($priceRangeSorting) && $priceRangeSorting==1 && ! isset ( $criteria ['quantity'] ))
	                {
	                	if ((isset ( $criteria [$pricePrefix.'min_price'] ) || isset ( $criteria [$pricePrefix.'max_price'] )) && ! isset ( $criteria ['quantity'] )) {
	                	 	$priceRangeSort = $this->addSortPriceInRange($this->priceQtyRange,'',$criteria);
	                	 	//$priceRangeSort = "_val_:".$priceRangeSort;
	                	 	if ($sortOrder == 'SORT_DESC') {
	                	 	 $query->addSort ( $priceRangeSort, $query::SORT_DESC ); // min price sorting
	                	 	} else {
	                	 	$query->addSort ( $priceRangeSort, $query::SORT_ASC ); // min price sorting
	                	 	}
	                	}
	                	// Sorting after applying quantity filter and shown price of that quantity : START
	                	if ($sortOrder == 'SORT_DESC') {
	                		$query->addSort ( $pricePrefix.'min_price_'.$serviceGroupIdFlag.'f', $query::SORT_DESC ); // min price sorting
	                	} else {
	                		$query->addSort ( $pricePrefix.'min_price_'.$serviceGroupIdFlag.'f', $query::SORT_ASC ); // min price sorting
	                	}
	                	// Sorting after applying quantity filter and shown price of that quantity : END
	                }
	                // Sorting after applying quantity filter and shown price of that quantity : START
	                else if ((isset ( $criteria [$pricePrefix.'min_price'] ) || isset ( $criteria [$pricePrefix.'max_price'] )) &&  isset ( $criteria ['quantity'] )) {
	                	$priceRangeSort = $this->addSortPriceForQuantity($criteria);
	                	//$qtyReturnPrice = "_val_:".$priceRangeSort;
	                	//$selectFields = array($qtyReturnPrice);
	                	if ($sortOrder == 'SORT_DESC') {
	                		$query->addSort ( $priceRangeSort, $query::SORT_DESC ); // min price sorting
	                	} else {
	                		$query->addSort ( $priceRangeSort, $query::SORT_ASC ); // min price sorting
	                	}
	                }
	                // Sorting after applying quantity filter and shown price of that quantity : END
	                else{
	                	
	                	//echo $serviceGroupIdFlag;exit;
	                	
						if ($sortOrder == 'SORT_DESC') {
							$query->addSort ( $pricePrefix.'min_price_'.$serviceGroupIdFlag.'f', $query::SORT_DESC ); // min price sorting
						} else {
							$query->addSort ( $pricePrefix.'min_price_'.$serviceGroupIdFlag.'f', $query::SORT_ASC ); // min price sorting
						}
					}
                }
			}
			// for price sort end

			// for rating sort start
			if ($sortField == 'rating') {
				$query->addSort ( 'custom_sort_order_i', $query::SORT_ASC );
				if ($sortOrder == 'SORT_DESC') {
					$query->addSort ( 'rating_f', $query::SORT_DESC ); // min price sorting
				} else {
					$query->addSort ( 'rating_f', $query::SORT_ASC ); // min price sorting
				}
			}
			// for rating sort end


			if ($sortField == 'relevancy') {
				// $query->addSort('price_currency_s', $query::SORT_ASC);
				//$query->addSort('call_for_price_s', $query::SORT_ASC);
				//$query->addSort ( 'custom_sort_order_i', $query::SORT_ASC );
				if ($sortOrder == 'SORT_DESC') {
					$query->addSort ( 'score', $query::SORT_DESC ); // relevancy wise sorting
				} else {
					$query->addSort ( 'score', $query::SORT_ASC ); // relevancy wise sorting
				}
                $query->addSort ( 'title_t', $query::SORT_ASC ); // relevancy wise sorting
			}
			
			if ($sortField == 'availability') {
				// $query->addSort('price_currency_s', $query::SORT_ASC);
				//$query->addSort('call_for_price_s', $query::SORT_ASC);
				//$query->addSort ( 'custom_sort_order_i', $query::SORT_ASC );
				if ($sortOrder == 'SORT_DESC') {
					$query->addSort ( 'price_valid_until_s', $query::SORT_DESC ); // availability wise sorting
				} else {
					$query->addSort ( 'price_valid_until_s', $query::SORT_ASC ); // availability wise sorting
				}
			}

			// /For post priotization allow field
			if (isset ( $criteria ['distributor_id'] ) && in_array ( $sortField, $postPrioritizationAllowField )) {
				// TODO please remove below code to enable priortize suppler order.
				// $this->addPrioritizeSupplierSortOrder ( $query, $criteria ['distributor_id'] );
			}

		} else {

			// /For post priotization allow field
			if (isset ( $criteria ['distributor_id'] )) {
				// TODO please remove below code to enable priortize suppler order.
				// $this->addPrioritizeSupplierSortOrder ( $query, $criteria ['distributor_id'] );
			}
			// $query->addSort('price_currency_s', $query::SORT_ASC);
			//$query->addSort('call_for_price_s', $query::SORT_ASC);
			$query->addSort ( 'custom_sort_order_i', $query::SORT_ASC );
			$query->addSort ( 'score', $query::SORT_DESC ); // relevancy wise sorting
		}

		// This is added by chirag and Ajay as per Amit & Arty request for Banner Pen Request
// 		if ((isset ( $criteria ['supplier_id'] ) && count ( $criteria ['supplier_id'] ) or isset ( $criteria ['supplier_name'] )) or (isset ( $criteria ['line_name_id'] ) && count ( $criteria ['line_name_id'] ) or isset ( $criteria ['line_name'] ))) {
// 			$query->addSort ( 'title_s', $query::SORT_ASC );
// 		}

		// var_dump($query->getSorts());die;
		// var_dump(get_class_methods(get_class($query)));die;
		$start = 0;
		$rows = 10;

		if (isset ( $criteria ['rows'] )) {
			$rows = $criteria ['rows'];
		}

		if (isset ( $criteria ['page'] )) {
			$start = ($criteria ['page'] - 1) * $rows;
		}
		if($showAllRecords)
		{
			$selectFields = array (
				'id',
				'keyword_ss',
				'keyword_txt',
				'category_is',
				'currency_name_s',
				'rating_f',
				'inactive_category_id_ss',
				'instance_id_i',
				'price_unit_s',
				'supplier_t',
				'sku_t',
				'sku_s',
				'sku',
				'title_s',
				'spelling',
				'color_mapping',
				'color_search_image',
				'color_mapping_search',
				'variation_image_path_txt',
				'variation_image_id_ss',
				'production_time_i',
				'call_for_price_s',
				'line_name_t',
				'line_name_s',
				'line_name_id_i',
				'line_name_id_name_ss',
				'category_name_ss',
				'category_name_txt',
				'category_name_id_ss',
				'is_feature_product_t',
				'catalog_year_s',
				'price_valid_until_s',
				'price_currency_s',
				'post_name_s',
				'custom_sort_order_i',		
						
			    'product_id_i',
			    'culture_product_id_i',
			    'title_t',
			    'sku_t',
			    'description_t',
			    'supplier_id_i',
			    'min_price_f',
				'coded_min_price_f',
			    'max_price_f',
				'coded_max_price_f',
			    'min_quantity_i',
				'coded_min_quantity_i',
			    'max_quantity_i',
				'coded_max_quantity_i',
			    'base_price_f',
			    'supplier_s',
			    'supplier_name_s',
			    'slug_t',
			    'image_path_t',
			    'image_thumb_path_t',
				'us_min_price_f',
				'us_min_code_s',
				'us_coded_min_price_f',
				'ca_min_price_f',
				'ca_min_code_s',
				'ca_coded_min_price_f',
				'us_max_price_f',
				'us_max_code_s',
				'us_coded_max_price_f',
				'ca_max_price_f',
				'ca_max_code_s',
				'ca_coded_max_price_f',
				'custom_campaigns_is',
				'original_sku_number_s'
			);
		}
		else{
			$selectFields = array (
			  'id',
/*			    'content_type_txt',
			    'title_txt',
			    'comments_txt',*/
				'product_id_i',
			    'culture_product_id_i',
				'title_t',
				'description_t',
				'sku_t',
				'price_unit_s',
				'slug_t',
				'image_path_t',
				'image_thumb_path_t',
				'min_price_f',
				'coded_min_price_f',
				'max_price_f',
				'coded_max_price_f',
				'supplier_id_i',
				//'original_supplier_id_i',
				'line_name_t',
				'line_name_id_i',
			    'line_name_id_name_ss',
				'base_price_f',
				'category_name_ss',
				'category_name_id_ss',
				'catalog_year_t',
				'price_currency_s',
				'price_valid_until_s',
				'supplier_s',
				'post_name_s',
				'pppc_member_number_s',
				'min_quantity_i',
				'max_quantity_i',
				'post_name_s',
				'attribute_ss',
				'score',
				'product_tag_is',
				'mapped_product_id_is',
				'rating_f',
				'currency_name_s',
				'supplier_name_s',
				'category_name_ss',
				'public_custom_tag_is',
				'public_custom_tag_ss',
				'private_custom_tag_is',
				'private_custom_tag_ss',
				'custom_tag_style_ss',
				'color_ss',
				'variation_image_path_txt',
				'variation_image_id_ss',
				'color_mapping',
				'color_mapping_search',
				'call_for_price_s',
				// Add : return_qty_sort_price : for Sorting after applying quantity filter and shown price of that quantity
				'return_qty_sort_price',
				'size_ss',
				'size_id_is',
				'ink_ss',
				'ink_id_is',
				'production_time_i',
				'fob_ss',
				'fob_city_state_ss',
				'us_min_price_f',
				'us_min_code_s',
				'us_coded_min_price_f',
				'ca_min_price_f',
				'ca_min_code_s',
				'ca_coded_min_price_f',
				'us_max_price_f',
				'us_max_code_s',
				'us_coded_max_price_f',
				'ca_max_price_f',
				'ca_max_code_s',
				'ca_coded_max_price_f',
				'custom_campaigns_is',
				'original_sku_number_s'
			);

		}
		
		/* 6799 : Temperory Comment */
		/*
		if (isset ( $this->priceQtyRange ) && $this->priceQtyRange > 0) {
			for($i = 1; $i <= $this->priceQtyRange; $i ++) {
				$minQty = 'min_qty_' . ($i) . '_i';
				$coded_minQty = 'coded_min_qty_' . ($i) . '_i';
				$maxQty = 'max_qty_' . ($i) . '_i';
				$coded_maxQty = 'coded_max_qty_' . ($i) . '_i';
				$price = 'price_' . ($i) . '_f';
				$coded_price = 'coded_price_' . ($i) . '_f';
				$code = 'code_' . ($i) . '_s';
				$coded_code = 'coded_code_' . ($i) . '_s';
				array_push ( $selectFields, $minQty );
				array_push ( $selectFields, $coded_minQty );
				array_push ( $selectFields, $maxQty );
				array_push ( $selectFields, $coded_maxQty );
				array_push ( $selectFields, $price );
				array_push ( $selectFields, $coded_price );
				array_push ( $selectFields, $code );
				array_push ( $selectFields, $coded_code );
			}
		}
		*/
		/* EO - 6799 : Temperory Comment */
		if ( isset($criteria['service_group_id']) && $criteria['service_group_id'] > 0 ){
			$group_id = $criteria['service_group_id'];
			/* $min_promo_price = 'min_price_'.$group_id.'_f';
			 $max_promo_price = 'max_price_'.$group_id.'_f';
			$has_promo_price = 'has_promo_price_'.$group_id.'_i'; */

			for($i = 1; $i <= $this->priceQtyRange; $i ++) {
				$minGroupQty = 'min_qty_'.$group_id.'_' . ($i) . '_i';
				$coded_minGroupQty = 'coded_min_qty_'.$group_id.'_' . ($i) . '_i';
				$maxGroupQty = 'max_qty_'.$group_id.'_' . ($i) . '_i';
				$coded_maxGroupQty = 'coded_max_qty_'.$group_id.'_' . ($i) . '_i';
				$groupPrice = 'price_'.$group_id.'_' . ($i) . '_f';
				$coded_groupPrice = 'coded_price_'.$group_id.'_' . ($i) . '_f';
				$groupCode = 'code_'.$group_id.'_' . ($i) . '_s';
				$coded_groupCode = 'coded_code_'.$group_id.'_' . ($i) . '_s';
				array_push ( $selectFields, $minGroupQty );
				array_push ( $selectFields, $coded_minGroupQty );
				array_push ( $selectFields, $maxGroupQty );
				array_push ( $selectFields, $coded_maxGroupQty );
				array_push ( $selectFields, $groupPrice );
				array_push ( $selectFields, $coded_groupPrice );
				array_push ( $selectFields, $groupCode );
				array_push ( $selectFields, $coded_groupCode );
			}
			$minGroupPrice = 'min_price_'.$group_id . '_f';
			$coded_minGroupPrice = 'coded_min_price_'.$group_id . '_f';
			$maxGroupPrice = 'max_price_'.$group_id . '_f';
			$coded_maxGroupPrice = 'coded_max_price_'.$group_id . '_f';
			array_push ( $selectFields, $minGroupPrice );
			array_push ( $selectFields, $coded_minGroupPrice );
			array_push ( $selectFields, $maxGroupPrice );
			array_push ( $selectFields, $coded_maxGroupPrice );
		}
		// Sorting after applying quantity filter and shown price of that quantity : START
		if ((isset ( $criteria [$pricePrefix.'min_price'] ) || isset ( $criteria [$pricePrefix.'max_price'] )) &&  isset ( $criteria ['quantity'] )) {
			$qtyReturnPrice = "price_matched_by_quantity:".$priceRangeSort;
			array_push ( $selectFields, $qtyReturnPrice );
		}
		// Sorting after applying quantity filter and shown price of that quantity : END
		if($this->setSelectedFld!=null){
			$query->setFields ( $this->setSelectedFld );
		}else{
			$query->setFields ( $selectFields );
		}
		//echo 'QUERY:<pre>';print_r($query);exit;
		return $query;
	}

	public function setSelectFld($setSelectedFld){
		$this->setSelectedFld = $setSelectedFld;
	}

         /**
	 * filter product solr query
	 *
	 * @param SolrQuery $query
	 *        	solr query instance
	 * @param array $criteria
	 *        	criteria array
	 *        	
	 * @return unknown
	 */
	public function filterProductForTags($query,$sku,$productId = 0) {
          //  var_dump($query);
                $criteria['sku']=$sku;   
                $criteria ['product_id'] = (intval($productId)>0)?$productId:"";
                $criteria ['search_type'] = 'all';
                $criteria['main_search_type'] = "AND";
		$filters = array ();
				
		$query->createFilterQuery ( 'noFeatureProduct' )->setQuery ( 'is_feature_product_t:"no"' );
		
		
		if (isset ( $criteria ['sku'] )) {
			if (is_array ( $criteria ['sku'] )) {
				$criteria ['sku'] = implode ( ' OR ', $criteria ['sku'] );
			}
			// Changed the SKU Filter Logic
			switch ($criteria ['search_type']) {
				case 'all' :
					$filters [] = 'sku:("' . str_replace ( ' ', '" AND "', addslashes ( $criteria ['sku'] ) ) . '")';
					break;
				case 'exact' :
					$filters [] = 'sku_exact:("' . addslashes ( $criteria ['sku'] ) . '")';
					break;
				case 'any' :
					$filters [] = 'sku:("' . str_replace ( ' ', '" OR "', addslashes ( $criteria ['sku'] ) ) . '")';
					break;
			}
		}
		
		if (isset ( $criteria ['supplier_id'] ) && count ( $criteria ['supplier_id'] )) {
			$catStr = implode ( ' OR ', $criteria ['supplier_id'] );
			$catStr = "(" . $catStr . ")";
			$filters [] = 'supplier_id_i:' . $catStr;
		}
		
		if (isset ( $criteria ['line_name_id'] ) && count ( $criteria ['line_name_id'] )) {
			$catStr = implode ( ' OR ', $criteria ['line_name_id'] );
			$catStr = "(" . $catStr . ")";
			$filters [] = 'line_name_id_i:' . $catStr;
		}
		
		if (isset ( $criteria ['brand_id'] )) {
			$catStr = implode ( ' OR ', $criteria ['brand_id'][0] );
			$catStr = "(" . $catStr . ")";
			$filters [] = 'line_name_id_i:' . $catStr;
		}
	
               if (isset ( $criteria ['product_id'] ) && $criteria ['product_id']!="") {
			
			$filters [] = 'product_id_i:' . $criteria ['product_id'];
		}
		// add a price filter
		if(isset($this->user) && is_object($this->user) && (!(empty($this->user))) && $this->user->getId()>0 )
		{
			$this->addCodedPriceFilter ( $filters, $criteria );
		}
		else
		{
			$this->addPriceFilter ( $filters, $criteria );
		}
				
		if(!isset($criteria['main_search_type']) || in_array($criteria['main_search_type'],array("AND","OR"))){
			$criteria['main_search_type'] = "AND";
		}
		if(isset ($criteria['instance_id'])){
			$filters [] = 'instance_id_i:'.$criteria['instance_id'];
		}
		$filtersStr = implode ( ' '.$criteria['main_search_type'].' ', $filters );
		
		$query->createFilterQuery ( 'search_product' )->setQuery ( $filtersStr );
		if(isset($tmpKeyWord)){
			$hl = $query->getHighlighting();
			$hl->setQuery('color_search_image:'.$tmpKeyWord);
			$hl->setFields('color_search_image');
			$hl->setSimplePrefix('');
			$hl->setSimplePostfix('');
		}
		// /Adding Filteration logic
		$postPrioritizationAllowField = array (
				'price_currency',
				'base_price' 
		);
		
                $query->addSort ( 'custom_sort_order_i', $query::SORT_ASC );
                $query->addSort ( 'score', $query::SORT_DESC ); // relevancy wise sorting
		
		$start = 0;
		$rows = 10;
		
                $selectFields = array (
                  'id',
                        'product_id_i',				
                        'sku_t',
                        'slug_t',				
                        'public_custom_tag_is',
                        'public_custom_tag_ss',
                        'private_custom_tag_is',
                        'private_custom_tag_ss',
                        'custom_tag_style_ss',
                        'color_ss'				
                );
			
		$query->setFields ( $selectFields );

		return $query;
	}
        
	/**
	 * function to generate facen
	 *
	 * @param unknown $query
	 * @param array $criteria
	 *
	 * @return SolrQuery
	 */
	public function getFacetQuery($query, $criteria) {
		// get the facetset component
		$pricePrefix= $this->myCurrentCountryPricePrefix();
		$facetSet = $query->getFacetSet ();
		$facetSet->setLimit ( - 1 );
		if (isset ( $criteria ['childCategoryIds'] )) {
			$filterStr = ' (' . implode ( ' AND ', $criteria ['childCategoryIds'] ) . ') ';
			$facetSet->createFacetQuery ( 'category_is' )->setQuery ( 'category_is: ' . $filterStr );
		}
		if (isset ( $criteria ['categoryId'] )) {
			$facetSet->createFacetField ( 'categoryId' )->setField ( 'category_is' )->setMinCount ( 0 )->setSort ( 'count' ); // ->setQuery('category_is: ('.$criteria['categoryId'].')');
			$facetSet->createFacetField ( 'categoryName' )->setField ( 'category_name_ss' )->setMinCount ( 0 )->setSort ( 'count' ); // ->setQuery('category_is: ('.$criteria['categoryId'].')');
			$facetSet->createFacetField ( 'categoryNameId' )->setField ( 'category_name_id_ss' )->setMinCount ( 0 )->setSort ( 'count' ); // ->setQuery('category_is: ('.$criteria['categoryId'].')');
		}
		
		if (isset ( $criteria ['supplierId'] )) {
			$facetSet->createFacetField ( 'supplierId' )->setField ( 'supplier_id_i' )->setMinCount ( 0 )->setSort ( 'count' );
			$facetSet->createFacetField ( 'supplierName' )->setField ( 'supplier_s' )->setMinCount ( 0 )->setSort ( 'count' );
		}
		/* if (isset ( $criteria ['originalSupplierId'] )) {
			$facetSet->createFacetField ( 'originalSupplierId' )->setField ( 'original_supplier_id_i' )->setMinCount ( 0 )->setSort ( 'count' );
		} */
		if (isset ( $criteria ['lineNameId'] )) {
			$facetSet->createFacetField ( 'lineNameId' )->setField ( 'line_name_id_i' )->setMinCount ( 0 )->setSort ( 'count' );
			$facetSet->createFacetField ( 'lineName' )->setField ( 'line_name_s' )->setMinCount ( 0 )->setSort ( 'count' );
			$facetSet->createFacetField ( 'lineNameIdName' )->setField ( 'line_name_id_name_ss' )->setMinCount ( 0 )->setSort ( 'count' );
		}
		/* if (isset ( $criteria ['lineName'] )) {
		    $facetSet->createFacetField ( 'lineNameId' )->setField ( 'line_name_id_i' )->setMinCount ( 0 )->setSort ( 'count' );
			$facetSet->createFacetField ( 'lineName' )->setField ( 'line_name_s' )->setMinCount ( 0 )->setSort ( 'count' );
			$facetSet->createFacetField ( 'lineNameIdName' )->setField ( 'line_name_id_name_ss' )->setMinCount ( 0 )->setSort ( 'count' );

		} */
		if (isset ( $criteria ['colorMapping'] )) {
			$facetSet->createFacetField ( 'colorMapping' )->setField ( 'color_mapping' )->setMinCount ( 0 )->setSort ( 'count' );
		}
		if (isset ( $criteria ['catalogYear'] )) {
			$facetSet->createFacetField ( 'catalogYear' )->setField ( 'catalog_year_s' )->setMinCount ( 0 )->setSort ( 'count' );
		}
		if (isset ( $criteria ['productAttribute'] )) {
			//$facetSet->createFacetField ( 'productAttribute' )->setField ( 'attribute_ss' )->setMinCount ( 0 )->setSort ( 'count' );
			$facetSet->createFacetField ( 'productAttribute' )->setField ( 'color_ss' )->setMinCount ( 0 )->setSort ( 'count' );
		}
		if (isset ( $criteria ['size'] )) {
			$facetSet->createFacetField ( 'size' )->setField ( 'size_ss' )->setMinCount ( 0 )->setSort ( 'count' );
		}
		if (isset ( $criteria ['size_id'] )) {
			$facetSet->createFacetField ( 'size_id' )->setField ( 'size_id_is' )->setMinCount ( 0 )->setSort ( 'count' );
		}
		if (isset ( $criteria ['ink'] )) {
			$facetSet->createFacetField ( 'ink' )->setField ( 'ink_ss' )->setMinCount ( 0 )->setSort ( 'count' );
		}
		if (isset ( $criteria ['ink_id'] )) {
			$facetSet->createFacetField ( 'ink_id' )->setField ( 'ink_id_is' )->setMinCount ( 0 )->setSort ( 'count' );
		}
		if (isset ( $criteria ['productionTimeId'] )) {
			//$facetSet->createFacetField ( 'productionTimeId' )->setField ( 'production_time_i' )->setMinCount ( 0 )->setSort ( 'count' );
			$facetSet->createFacetField ( 'productionTimeId' )->setField ( 'production_time_unit_ss' )->setMinCount ( 0 )->setSort ( 'count' );
		}
		if (isset ( $criteria ['production_time_id'] )) {
			$facetSet->createFacetField ( 'production_time_id' )->setField ( 'production_time_id_is' )->setMinCount ( 0 )->setSort ( 'count' );
		}
		if (isset ( $criteria ['fobId'] )) {
			$facetSet->createFacetField ( 'fobId' )->setField ( 'fob_city_state_ss' )->setMinCount ( 0 )->setSort ( 'count' );
		}
		if (isset ( $criteria ['fob_id'] )) {
			$facetSet->createFacetField ( 'fob_id' )->setField ( 'fob_id_is' )->setMinCount ( 0 )->setSort ( 'count' );
		}
		if (isset ( $criteria ['priceValidUntil'] )) {
			$facetSet->createFacetField ( 'priceValidUntil' )->setField ( 'price_valid_until_s' )->setMinCount ( 0 )->setSort ( 'count' );
		}
		if (isset ( $criteria ['priceCurrency'] )) {
			$facetSet->createFacetField ( 'priceCurrency' )->setField ( 'price_currency_s' )->setMinCount ( 0 )->setSort ( 'count' );
		}
		if (isset ( $criteria ['publicCustomTagText'] )) {
			$facetSet->createFacetField ( 'publicCustomTagText' )->setField ( 'custom_tag_style_ss' )->setMinCount ( 0 )->setSort ( 'count' );
//  			$facetSet->createFacetField ( 'publicCustomTagText' )->setField ( 'public_custom_tag_ss' )->setMinCount ( 0 )->setSort ( 'count' );
//  			$facetSet->createFacetField ( 'privateCustomTagText' )->setField ( 'private_custom_tag_ss' )->setMinCount ( 0 )->setSort ( 'count' );
		}
		if (isset ( $criteria ['callForPrice'] )) {
			$facetSet->createFacetField ( 'callForPrice' )->setField ( 'call_for_price_s' )->setMinCount ( 0 )->setSort ( 'count' );
		}
		if (isset ( $criteria ['priceRange'] )) {
			$statComponent = $query->getStats ();
			if (isset ( $criteria ['serviceGroupIdValue'] )) {
				if(isset($this->user) && is_object($this->user) && (!(empty($this->user))) && $this->user->getId()>0 )
				{
					$coded_minPrice = 'coded_min_price_'.$criteria ['serviceGroupIdValue'].'_f';
					$coded_maxPrice = 'coded_max_price_'.$criteria ['serviceGroupIdValue'].'_f';
					$statComponent->createField ($coded_minPrice);
					$statComponent->createField ($coded_maxPrice);
					$statComponent->createField ( 'coded_min_price_f' );
					$statComponent->createField ( 'coded_max_price_f' );
					$statComponent->createField ( 'us_coded_min_price_f' );
					$statComponent->createField ( 'us_coded_max_price_f' );
					$statComponent->createField ( 'ca_coded_min_price_f' );
					$statComponent->createField ( 'ca_coded_max_price_f' );
				}
				else
				{
					$minPrice = 'min_price_'.$criteria ['serviceGroupIdValue'].'_f';
					$maxPrice = 'max_price_'.$criteria ['serviceGroupIdValue'].'_f';
					$statComponent->createField ($minPrice);
					$statComponent->createField ($maxPrice);
					$statComponent->createField ( 'min_price_f' );
					$statComponent->createField ( 'max_price_f' );
					$statComponent->createField ( 'us_min_price_f' );
					$statComponent->createField ( 'us_max_price_f' );
					$statComponent->createField ( 'ca_min_price_f' );
					$statComponent->createField ( 'ca_max_price_f' );
				}

			}else{
				if(isset($this->user) && is_object($this->user) && (!(empty($this->user))) && $this->user->getId()>0 )
				{
					$statComponent->createField ( 'coded_min_price_f' );
					$statComponent->createField ( 'coded_max_price_f' );
					$statComponent->createField ( 'us_coded_min_price_f' );
					$statComponent->createField ( 'us_coded_max_price_f' );
					$statComponent->createField ( 'ca_coded_min_price_f' );
					$statComponent->createField ( 'ca_coded_max_price_f' );
				}
				else
				{
					$statComponent->createField ( 'min_price_f' );
					$statComponent->createField ( 'max_price_f' );
					$statComponent->createField ( 'us_min_price_f' );
					$statComponent->createField ( 'us_max_price_f' );
					$statComponent->createField ( 'ca_min_price_f' );
					$statComponent->createField ( 'ca_max_price_f' );
				}
			}
		}
		if (isset ( $criteria ['customCategory'] )) {
			$facetSet->createFacetField ( 'customCategory' )->setField ( 'custom_category_id_is' )->setMinCount ( 0 )->setSort ( 'count' );
		}
		//echo "<pre>";print_r($query);exit;
		return $query;
	}

	/**
	 * create feature product index
	 *
	 * @param updateObject $update
	 * @param object $product
	 * @param bool $commit
	 */
	public function createFeaturedProductsIndex($update, $product, $commit = true) {
		$doc = $update->createDocument ();

		$doc->id = "FeatureProduct_" . $product->tag_id;
		$doc->product_id_i = $product->tag_id;
		$doc->slug_s = $product->slug;

		$doc->user_full_name_s = $product->user_full_name;
		$doc->supplier_s = $product->supplier_company_name;

		$doc->title_t = \ForceUTF8\Encoding::toUTF8 ( $product->tag_name );
		$doc->description_t = \ForceUTF8\Encoding::toUTF8 ( $product->description );

		$doc->image_path_t = $product->image;
		$doc->mapped_product_id_is = explode ( ',', $product->product_list );
		$doc->mapped_product_i = $product->total_product;

		$doc->is_feature_product_t = "yes";

		$update->addDocument ( $doc );
		if ($commit) {
			$update->addCommit ();
			$this->searchClient->update ( $update );
		}
	}

	/**
	 * Function to add price filter
	 *
	 * @param
	 *        	$filter
	 * @param
	 *        	$criteria
	 */
	public function addPriceFilter(&$filter, $criteria) {
		$pricePrefix = $this->myCurrentCountryPricePrefix();
		//print_r($criteria [$pricePrefix.'min_price']);exit;
		// If min and max price are set but quantity is not set
		$priceFilterStr = "";
		$priceFilterStrWithOutServiceGroup = "";
		$criteria['service_group_id'] = "";
		if ( isset($criteria['service_group_id']) && $criteria['service_group_id'] > 0 ){
			$group_id = $criteria['service_group_id'];
			if ((isset ( $criteria [$pricePrefix.'min_price'] ) || isset ( $criteria [$pricePrefix.'max_price'] )) && ! isset ( $criteria ['quantity'] )) {
				if (isset ( $criteria [$pricePrefix.'min_price'] )) {
					$priceFilterStr = $pricePrefix.'min_price_'.$group_id.'_f:[' . $criteria [$pricePrefix.'min_price'] . ' TO *]';
					$priceFilterStrWithOutServiceGroup = $pricePrefix.'min_price_'.'f:[' . $criteria [$pricePrefix.'min_price'] . ' TO *]';
				}
				if (isset ( $criteria [$pricePrefix.'max_price'] )) {
					$startAt = isset ( $criteria [$pricePrefix.'min_price'] ) ? $criteria [$pricePrefix.'min_price'] : '*';
					$and = isset ( $criteria [$pricePrefix.'min_price'] ) ? $pricePrefix.'min_price_'.$group_id.'_f:[' . $criteria [$pricePrefix.'min_price'] . ' TO ' . $criteria [$pricePrefix.'max_price'] . '] OR ' : '';
					$priceFilterStr = $and . $pricePrefix.'max_price_'.$group_id.'_f:[ ' . $startAt . ' TO ' . $criteria [$pricePrefix.'max_price'] . ']';
					$priceFilterStrWithOutServiceGroup = $and . $pricePrefix.'max_price_'.'f:[ ' . $startAt . ' TO ' . $criteria [$pricePrefix.'max_price'] . ']';
				}
				$filter [] = '((' . $priceFilterStr . ')'.' OR '.'(' . $priceFilterStrWithOutServiceGroup . '))';
				// If min and max price are set and quantity is also set
			} else if ((isset ( $criteria [$pricePrefix.'min_price'] ) || isset ( $criteria [$pricePrefix.'max_price'] )) && isset ( $criteria ['quantity'] )) {
				$tmpSearchQryArr = array ();
				$minPrice = isset ( $criteria [$pricePrefix.'min_price'] ) ? $criteria [$pricePrefix.'min_price'] : '*';
				$maxPrice = isset ( $criteria [$pricePrefix.'max_price'] ) ? $criteria [$pricePrefix.'max_price'] : '*';
				if ($this->priceQtyRange > 0) {
					for($key = 1; $key <= $this->priceQtyRange; $key ++) {
						$minQtyField = $pricePrefix.'min_qty_'.$group_id.'_' . ($key) . '_i';
						$maxQtyField = $pricePrefix.'max_qty_'.$group_id.'_'. ($key) . '_i';
						$priceField = 'price_'.$group_id.'_'. ($key) . '_f';
						$tmpSearchQryArr [] = '( ' . $priceField . ':[' . $minPrice . ' TO ' . $maxPrice . '] AND (' . $minQtyField . ':[* TO ' . $criteria ["quantity"] . '] AND ' . $maxQtyField . ':[' . $criteria ["quantity"] . ' TO  *]) )';
					}
					$filter [] = '(' . implode ( ' OR ', $tmpSearchQryArr ) . ')';
				} else {
					$filter [] = '('.$pricePrefix.'min_price:[' . $minPrice . ' TO *] AND '.$pricePrefix.'max_price:[* TO ' . $maxPrice . ']
                AND min_quantity_i: [' . $criteria ['quantity'] . ' TO * ] AND max_quantity_i: [* TO ' . $criteria ['quantity'] . '])';
				}
				// when only quantity is set
			} else if (! isset ( $criteria [$pricePrefix.'min_price'] ) && ! isset ( $criteria [$pricePrefix.'max_price'] ) && isset ( $criteria ['quantity'] )) {
				if ($this->priceQtyRange > 0) {
					for($key = 1; $key <= $this->priceQtyRange; $key ++) {
						$minQtyField = $pricePrefix.'min_qty_'.$group_id.'_' . ($key) . '_i';
						$maxQtyField = $pricePrefix.'max_qty_'.$group_id.'_'. ($key) . '_i';
						$tmpSearchQryArr [] = '( (' . $minQtyField . ':[* TO ' . $criteria ["quantity"] . '] AND ' . $maxQtyField . ':[' . $criteria ["quantity"] . ' TO  *]) )';
					}
					$filter [] = '(' . implode ( ' OR ', $tmpSearchQryArr ) . ')';
				} else {
					$filter [] = '(min_quantity_i: ' . $criteria ['quantity'] . ' AND max_quantity_i: [' . $criteria ['quantity'] . ' TO *])';
				}
			}
		}
		else {
			if ((isset ( $criteria [$pricePrefix.'min_price'] ) || isset ( $criteria [$pricePrefix.'max_price'] )) && ! isset ( $criteria ['quantity'] )) {
				if (isset ( $criteria [$pricePrefix.'min_price'] )) {
					$priceFilterStr = $pricePrefix.'min_price_f:[' . $criteria [$pricePrefix.'min_price'] . ' TO *]';
				}
				if (isset ( $criteria [$pricePrefix.'max_price'] )) {
					$startAt = isset ( $criteria [$pricePrefix.'min_price'] ) ? $criteria [$pricePrefix.'min_price'] : '*';
					$and = isset ( $criteria [$pricePrefix.'min_price'] ) ? $pricePrefix.'min_price_f:[' . $criteria [$pricePrefix.'min_price'] . ' TO ' . $criteria [$pricePrefix.'max_price'] . '] OR ' : '';
					$priceFilterStr = $and . $pricePrefix.'max_price_f:[ ' . $startAt . ' TO ' . $criteria [$pricePrefix.'max_price'] . ']';
				}
				$filter [] = '(' . $priceFilterStr . ')';
				// If min and max price are set and quantity is also set
			} else if ((isset ( $criteria [$pricePrefix.'min_price'] ) || isset ( $criteria [$pricePrefix.'max_price'] )) && isset ( $criteria ['quantity'] )) {
				$tmpSearchQryArr = array ();
				$minPrice = isset ( $criteria [$pricePrefix.'min_price'] ) ? $criteria [$pricePrefix.'min_price'] : '*';
				$maxPrice = isset ( $criteria [$pricePrefix.'max_price'] ) ? $criteria [$pricePrefix.'max_price'] : '*';
				if ($this->priceQtyRange > 0) {
					for($key = 1; $key <= $this->priceQtyRange; $key ++) {
						$minQtyField = $pricePrefix.'min_qty_' . ($key) . '_i';
						$maxQtyField = $pricePrefix.'max_qty_' . ($key) . '_i';
						$priceField = 'price_' . ($key) . '_f';
						$tmpSearchQryArr [] = '( ' . $priceField . ':[' . $minPrice . ' TO ' . $maxPrice . '] AND (' . $minQtyField . ':[* TO ' . $criteria ["quantity"] . '] AND ' . $maxQtyField . ':[' . $criteria ["quantity"] . ' TO  *]) )';
					}
					$filter [] = '(' . implode ( ' OR ', $tmpSearchQryArr ) . ')';
				} else {
					$filter [] = '('.$pricePrefix.'min_price:[' . $minPrice . ' TO *] AND '.$pricePrefix.'max_price:[* TO ' . $maxPrice . ']
                AND min_quantity_i: [' . $criteria ['quantity'] . ' TO * ] AND max_quantity_i: [* TO ' . $criteria ['quantity'] . '])';
				}
				// when only quantity is set
			} else if (! isset ( $criteria [$pricePrefix.'min_price'] ) && ! isset ( $criteria [$pricePrefix.'max_price'] ) && isset ( $criteria ['quantity'] )) {
				if ($this->priceQtyRange > 0) {
					for($key = 1; $key <= $this->priceQtyRange; $key ++) {
						$minQtyField = $pricePrefix.'min_qty_' . ($key) . '_i';
						$maxQtyField = $pricePrefix.'max_qty_' . ($key) . '_i';
						$tmpSearchQryArr [] = '( (' . $minQtyField . ':[* TO ' . $criteria ["quantity"] . '] AND ' . $maxQtyField . ':[' . $criteria ["quantity"] . ' TO  *]) )';
					}
					$filter [] = '(' . implode ( ' OR ', $tmpSearchQryArr ) . ')';
				} else {
					$filter [] = '(min_quantity_i: ' . $criteria ['quantity'] . ' AND max_quantity_i: [' . $criteria ['quantity'] . ' TO *])';
				}
			}
		}
		/*if ((isset ( $criteria [$pricePrefix.'min_price'] ) || isset ( $criteria [$pricePrefix.'max_price'] )) && ! isset ( $criteria ['quantity'] )) {
		 if (isset ( $criteria [$pricePrefix.'min_price'] )) {
		 $priceFilterStr = $pricePrefix.'min_price_f:[' . $criteria [$pricePrefix.'min_price'] . ' TO *]';
		 }
		 if (isset ( $criteria [$pricePrefix.'max_price'] )) {
		 $startAt = isset ( $criteria [$pricePrefix.'min_price'] ) ? $criteria [$pricePrefix.'min_price'] : '*';
		 $and = isset ( $criteria [$pricePrefix.'min_price'] ) ? $pricePrefix.'min_price_f:[' . $criteria [$pricePrefix.'min_price'] . ' TO ' . $criteria [$pricePrefix.'max_price'] . '] OR ' : '';
		 $priceFilterStr = $and . $pricePrefix.'max_price_f:[ ' . $startAt . ' TO ' . $criteria [$pricePrefix.'max_price'] . ']';
		 }
		 $filter [] = '(' . $priceFilterStr . ')';
		 // If min and max price are set and quantity is also set
		 } else if ((isset ( $criteria [$pricePrefix.'min_price'] ) || isset ( $criteria [$pricePrefix.'max_price'] )) && isset ( $criteria ['quantity'] )) {
		 $tmpSearchQryArr = array ();
		 $minPrice = isset ( $criteria [$pricePrefix.'min_price'] ) ? $criteria [$pricePrefix.'min_price'] : '*';
		 $maxPrice = isset ( $criteria [$pricePrefix.'max_price'] ) ? $criteria [$pricePrefix.'max_price'] : '*';
		 if ($this->priceQtyRange > 0) {
		 for($key = 1; $key <= $this->priceQtyRange; $key ++) {
		 $minQtyField = $pricePrefix.'min_qty_' . ($key) . '_i';
		 $maxQtyField = $pricePrefix.'max_qty_' . ($key) . '_i';
		 $priceField = 'price_' . ($key) . '_f';
		 $tmpSearchQryArr [] = '( ' . $priceField . ':[' . $minPrice . ' TO ' . $maxPrice . '] AND (' . $minQtyField . ':[* TO ' . $criteria ["quantity"] . '] AND ' . $maxQtyField . ':[' . $criteria ["quantity"] . ' TO  *]) )';
		 }
		 $filter [] = '(' . implode ( ' OR ', $tmpSearchQryArr ) . ')';
		 } else {
		 $filter [] = '(min_price:[' . $minPrice . ' TO *] AND max_price:[* TO ' . $maxPrice . ']
		 AND min_quantity_i: [' . $criteria ['quantity'] . ' TO * ] AND max_quantity_i: [* TO ' . $criteria ['quantity'] . '])';
		 }
		 // when only quantity is set
		 } else if (! isset ( $criteria [$pricePrefix.'min_price'] ) && ! isset ( $criteria [$pricePrefix.'max_price'] ) && isset ( $criteria ['quantity'] )) {
		 if ($this->priceQtyRange > 0) {
		 for($key = 1; $key <= $this->priceQtyRange; $key ++) {
		 $minQtyField = $pricePrefix.'min_qty_' . ($key) . '_i';
		 $maxQtyField = $pricePrefix.'max_qty_' . ($key) . '_i';
		 $tmpSearchQryArr [] = '( (' . $minQtyField . ':[* TO ' . $criteria ["quantity"] . '] AND ' . $maxQtyField . ':[' . $criteria ["quantity"] . ' TO  *]) )';
		 }
		 $filter [] = '(' . implode ( ' OR ', $tmpSearchQryArr ) . ')';
		 } else {
		 $filter [] = '(min_quantity_i: ' . $criteria ['quantity'] . ' AND max_quantity_i: [' . $criteria ['quantity'] . ' TO *])';
		 }
		 }*/
		// if min_price and max price both set to 0 than we will not load call_for_price data
		// 		if (isset ( $criteria [$pricePrefix.'min_price'] ) && isset ( $criteria [$pricePrefix.'max_price'] ) && $criteria [$pricePrefix.'min_price'] >= 0 && $criteria [$pricePrefix.'max_price'] >= 0) {
		// 			$filter [] = 'call_for_price_s: "no"';
		// 		}
			if (isset ( $criteria ['call_for_price'] ) && strtolower ( $criteria ['call_for_price'] ) == "yes") {
				$filter [] = 'call_for_price_s: "yes"';
			}
	}
	


	/**
	 * Function to add price filter
	 *
	 * @param
	 *        	$filter
	 * @param
	 *        	$criteria
	 */
	public function addCodedPriceFilter(&$filter, $criteria) {
		$pricePrefix= $this->myCurrentCountryPricePrefix();
		//print_r($criteria [$pricePrefix.'coded_min_price']);exit;
		// If min and max price are set but quantity is not set
		$priceFilterStr = "";
		$priceFilterStrWithOutServiceGroup = "";
		$criteria['service_group_id']="";
		if ( isset($criteria['service_group_id']) && $criteria['service_group_id'] > 0 ){
			$group_id = $criteria['service_group_id'];
			if ((isset ( $criteria [$pricePrefix.'coded_min_price'] ) || isset ( $criteria [$pricePrefix.'coded_max_price'] )) && ! isset ( $criteria ['quantity'] )) {
				if (isset ( $criteria [$pricePrefix.'coded_min_price'] )) {
					$priceFilterStr = $pricePrefix.'coded_min_price_'.$group_id.'_f:[' . $criteria [$pricePrefix.'coded_min_price'] . ' TO *]';
					$priceFilterStrWithOutServiceGroup = $pricePrefix.'coded_min_price_'.'f:[' . $criteria [$pricePrefix.'coded_min_price'] . ' TO *]';
				}
				if (isset ( $criteria [$pricePrefix.'coded_max_price'] )) {
					$startAt = isset ( $criteria [$pricePrefix.'coded_min_price'] ) ? $criteria [$pricePrefix.'coded_min_price'] : '*';
					$and = isset ( $criteria [$pricePrefix.'coded_min_price'] ) ? $pricePrefix.'coded_min_price_'.$group_id.'_f:[' . $criteria [$pricePrefix.'coded_min_price'] . ' TO ' . $criteria [$pricePrefix.'coded_max_price'] . '] OR ' : '';
					$priceFilterStr = $and . $pricePrefix.'coded_max_price_'.$group_id.'_f:[ ' . $startAt . ' TO ' . $criteria [$pricePrefix.'coded_max_price'] . ']';
					$priceFilterStrWithOutServiceGroup = $and . $pricePrefix.'coded_max_price_'.'f:[ ' . $startAt . ' TO ' . $criteria [$pricePrefix.'coded_max_price'] . ']';
				}
				$filter [] = '((' . $priceFilterStr . ')'.' OR '.'(' . $priceFilterStrWithOutServiceGroup . '))';
				// If min and max price are set and quantity is also set
			} else if ((isset ( $criteria [$pricePrefix.'coded_min_price'] ) || isset ( $criteria [$pricePrefix.'coded_max_price'] )) && isset ( $criteria ['quantity'] )) {
				$tmpSearchQryArr = array ();
				$minPrice = isset ( $criteria [$pricePrefix.'coded_min_price'] ) ? $criteria [$pricePrefix.'coded_min_price'] : '*';
				$maxPrice = isset ( $criteria [$pricePrefix.'coded_max_price'] ) ? $criteria [$pricePrefix.'coded_max_price'] : '*';
				if ($this->priceQtyRange > 0) {
					for($key = 1; $key <= $this->priceQtyRange; $key ++) {
						$minQtyField = 'min_qty_'.$group_id.'_' . ($key) . '_i';
						$maxQtyField = 'max_qty_'.$group_id.'_'. ($key) . '_i';
						$priceField = 'price_'.$group_id.'_'. ($key) . '_f';
						$tmpSearchQryArr [] = '( ' . $priceField . ':[' . $minPrice . ' TO ' . $maxPrice . '] AND (' . $minQtyField . ':[* TO ' . $criteria ["quantity"] . '] AND ' . $maxQtyField . ':[' . $criteria ["quantity"] . ' TO  *]) )';
					}
					$filter [] = '(' . implode ( ' OR ', $tmpSearchQryArr ) . ')';
				} else {
					$filter [] = '(min_price:[' . $minPrice . ' TO *] AND max_price:[* TO ' . $maxPrice . ']
                AND min_quantity_i: [' . $criteria ['quantity'] . ' TO * ] AND max_quantity_i: [* TO ' . $criteria ['quantity'] . '])';
				}
				// when only quantity is set
			} else if (! isset ( $criteria [$pricePrefix.'coded_min_price'] ) && ! isset ( $criteria [$pricePrefix.'coded_max_price'] ) && isset ( $criteria ['quantity'] )) {
				if ($this->priceQtyRange > 0) {
					for($key = 1; $key <= $this->priceQtyRange; $key ++) {
						$minQtyField = 'min_qty_'.$group_id.'_' . ($key) . '_i';
						$maxQtyField = 'max_qty_'.$group_id.'_'. ($key) . '_i';
						$tmpSearchQryArr [] = '( (' . $minQtyField . ':[* TO ' . $criteria ["quantity"] . '] AND ' . $maxQtyField . ':[' . $criteria ["quantity"] . ' TO  *]) )';
					}
					$filter [] = '(' . implode ( ' OR ', $tmpSearchQryArr ) . ')';
				} else {
					$filter [] = '(min_quantity_i: ' . $criteria ['quantity'] . ' AND max_quantity_i: [' . $criteria ['quantity'] . ' TO *])';
				}
			}
		}
		else {
			if ((isset ( $criteria [$pricePrefix.'coded_min_price'] ) || isset ( $criteria [$pricePrefix.'coded_max_price'] )) && ! isset ( $criteria ['quantity'] )) {
				if (isset ( $criteria [$pricePrefix.'coded_min_price'] )) {
					$priceFilterStr = $pricePrefix.'coded_min_price_f:[' . $criteria [$pricePrefix.'coded_min_price'] . ' TO *]';
				}
				if (isset ( $criteria [$pricePrefix.'coded_max_price'] )) {
					$startAt = isset ( $criteria [$pricePrefix.'coded_min_price'] ) ? $criteria [$pricePrefix.'coded_min_price'] : '*';
					$and = isset ( $criteria [$pricePrefix.'coded_min_price'] ) ? $pricePrefix.'coded_min_price_f:[' . $criteria [$pricePrefix.'coded_min_price'] . ' TO ' . $criteria [$pricePrefix.'coded_max_price'] . '] OR ' : '';
					$priceFilterStr = $and . $pricePrefix.'coded_max_price_f:[ ' . $startAt . ' TO ' . $criteria [$pricePrefix.'coded_max_price'] . ']';
				}
				$filter [] = '(' . $priceFilterStr . ')';
				// If min and max price are set and quantity is also set
			} else if ((isset ( $criteria [$pricePrefix.'coded_min_price'] ) || isset ( $criteria [$pricePrefix.'coded_max_price'] )) && isset ( $criteria ['quantity'] )) {
				$tmpSearchQryArr = array ();
				$minPrice = isset ( $criteria [$pricePrefix.'coded_min_price'] ) ? $criteria [$pricePrefix.'coded_min_price'] : '*';
				$maxPrice = isset ( $criteria [$pricePrefix.'coded_max_price'] ) ? $criteria [$pricePrefix.'coded_max_price'] : '*';
				if ($this->priceQtyRange > 0) {
					for($key = 1; $key <= $this->priceQtyRange; $key ++) {
						$minQtyField = 'min_qty_' . ($key) . '_i';
						$maxQtyField = 'max_qty_' . ($key) . '_i';
						$priceField = 'price_' . ($key) . '_f';
						$tmpSearchQryArr [] = '( ' . $priceField . ':[' . $minPrice . ' TO ' . $maxPrice . '] AND (' . $minQtyField . ':[* TO ' . $criteria ["quantity"] . '] AND ' . $maxQtyField . ':[' . $criteria ["quantity"] . ' TO  *]) )';
					}
					$filter [] = '(' . implode ( ' OR ', $tmpSearchQryArr ) . ')';
				} else {
					$filter [] = '(min_price:[' . $minPrice . ' TO *] AND max_price:[* TO ' . $maxPrice . ']
                AND min_quantity_i: [' . $criteria ['quantity'] . ' TO * ] AND max_quantity_i: [* TO ' . $criteria ['quantity'] . '])';
				}
				// when only quantity is set
			} else if (! isset ( $criteria [$pricePrefix.'coded_min_price'] ) && ! isset ( $criteria [$pricePrefix.'coded_max_price'] ) && isset ( $criteria ['quantity'] )) {
				if ($this->priceQtyRange > 0) {
					for($key = 1; $key <= $this->priceQtyRange; $key ++) {
						$minQtyField = 'min_qty_' . ($key) . '_i';
						$maxQtyField = 'max_qty_' . ($key) . '_i';
						$tmpSearchQryArr [] = '( (' . $minQtyField . ':[* TO ' . $criteria ["quantity"] . '] AND ' . $maxQtyField . ':[' . $criteria ["quantity"] . ' TO  *]) )';
					}
					$filter [] = '(' . implode ( ' OR ', $tmpSearchQryArr ) . ')';
				} else {
					$filter [] = '(min_quantity_i: ' . $criteria ['quantity'] . ' AND max_quantity_i: [' . $criteria ['quantity'] . ' TO *])';
				}
			}
		}
		/*if ((isset ( $criteria [$pricePrefix.'coded_min_price'] ) || isset ( $criteria [$pricePrefix.'coded_max_price'] )) && ! isset ( $criteria ['quantity'] )) {
		 if (isset ( $criteria [$pricePrefix.'coded_min_price'] )) {
		 $priceFilterStr = $pricePrefix.'coded_min_price_f:[' . $criteria [$pricePrefix.'coded_min_price'] . ' TO *]';
		 }
		 if (isset ( $criteria [$pricePrefix.'coded_max_price'] )) {
		 $startAt = isset ( $criteria [$pricePrefix.'coded_min_price'] ) ? $criteria [$pricePrefix.'coded_min_price'] : '*';
		 $and = isset ( $criteria [$pricePrefix.'coded_min_price'] ) ? $pricePrefix.'coded_min_price_f:[' . $criteria [$pricePrefix.'coded_min_price'] . ' TO ' . $criteria [$pricePrefix.'coded_max_price'] . '] OR ' : '';
		 $priceFilterStr = $and . $pricePrefix.'coded_max_price_f:[ ' . $startAt . ' TO ' . $criteria [$pricePrefix.'coded_max_price'] . ']';
		 }
		 $filter [] = '(' . $priceFilterStr . ')';
		 // If min and max price are set and quantity is also set
		 } else if ((isset ( $criteria [$pricePrefix.'coded_min_price'] ) || isset ( $criteria [$pricePrefix.'coded_max_price'] )) && isset ( $criteria ['quantity'] )) {
		 $tmpSearchQryArr = array ();
		 $minPrice = isset ( $criteria [$pricePrefix.'coded_min_price'] ) ? $criteria [$pricePrefix.'coded_min_price'] : '*';
		 $maxPrice = isset ( $criteria [$pricePrefix.'coded_max_price'] ) ? $criteria [$pricePrefix.'coded_max_price'] : '*';
		 if ($this->priceQtyRange > 0) {
		 for($key = 1; $key <= $this->priceQtyRange; $key ++) {
		 $minQtyField = 'min_qty_' . ($key) . '_i';
		 $maxQtyField = 'max_qty_' . ($key) . '_i';
		 $priceField = 'price_' . ($key) . '_f';
		 $tmpSearchQryArr [] = '( ' . $priceField . ':[' . $minPrice . ' TO ' . $maxPrice . '] AND (' . $minQtyField . ':[* TO ' . $criteria ["quantity"] . '] AND ' . $maxQtyField . ':[' . $criteria ["quantity"] . ' TO  *]) )';
		 }
		 $filter [] = '(' . implode ( ' OR ', $tmpSearchQryArr ) . ')';
		 } else {
		 $filter [] = '(min_price:[' . $minPrice . ' TO *] AND max_price:[* TO ' . $maxPrice . ']
		 AND min_quantity_i: [' . $criteria ['quantity'] . ' TO * ] AND max_quantity_i: [* TO ' . $criteria ['quantity'] . '])';
		 }
		 // when only quantity is set
		 } else if (! isset ( $criteria [$pricePrefix.'coded_min_price'] ) && ! isset ( $criteria [$pricePrefix.'coded_max_price'] ) && isset ( $criteria ['quantity'] )) {
		 if ($this->priceQtyRange > 0) {
		 for($key = 1; $key <= $this->priceQtyRange; $key ++) {
		 $minQtyField = 'min_qty_' . ($key) . '_i';
		 $maxQtyField = 'max_qty_' . ($key) . '_i';
		 $tmpSearchQryArr [] = '( (' . $minQtyField . ':[* TO ' . $criteria ["quantity"] . '] AND ' . $maxQtyField . ':[' . $criteria ["quantity"] . ' TO  *]) )';
		 }
		 $filter [] = '(' . implode ( ' OR ', $tmpSearchQryArr ) . ')';
		 } else {
		 $filter [] = '(min_quantity_i: ' . $criteria ['quantity'] . ' AND max_quantity_i: [' . $criteria ['quantity'] . ' TO *])';
		 }
		 }*/
		// if min_price and max price both set to 0 than we will not load call_for_price data
		// 		if (isset ( $criteria [$pricePrefix.'coded_min_price'] ) && isset ( $criteria [$pricePrefix.'coded_max_price'] ) && $criteria [$pricePrefix.'coded_min_price'] >= 0 && $criteria [$pricePrefix.'coded_max_price'] >= 0) {
		// 			$filter [] = 'call_for_price_s: "no"';
		// 		}
		if (isset ( $criteria ['call_for_price'] ) && strtolower ( $criteria ['call_for_price'] ) == "yes") {
			$filter [] = 'call_for_price_s: "yes"';
		}
	}
	public function getSuggestWords($word) {
		$query = $this->getCreateSuggesterQueryInstance ();
		$query->setQuery ( strtolower ( $word ) );
		$query->setCount ( 10 );
		$resultSet = $this->getSearchClient ()->suggester ( $query );
		return $resultSet->getResults ();
	}
	public function addPrioritizeSupplierSortOrder(&$query, $distributorId) {
		// $query->addSort("if(tf(prioritize_supplier_order_is,$distributorId),tf(prioritize_supplier_order_is,$distributorId),999999)", $query::SORT_ASC);
		$query->addSort ( "if(exists(prioritize_supplier_" . $distributorId . "_i),prioritize_supplier_" . $distributorId . "_i,99999)", $query::SORT_ASC );
	}
	public function insertPrioritizeField(&$doc, &$productObject) {
		foreach ( $productObject as $propertyName => $propertyValue ) {
			if (preg_match ( "/^prioritize_supplier_(\d+)$/", $propertyName ) > 0) {
				$key = $propertyName . '_i';
				$doc->$key = $propertyValue;
			}
		}
	}
	public function getKeywordsFromSolr() {
		$query = $this->getCreateQueryInstance ();
		$facetSet = $query->getFacetSet ();
		$facetSet->setLimit ( - 1 );
		$facetSet->createFacetField ( 'keywords' )->setField ( 'keyword_ss' )->setMinCount ( 1 )->setSort ( 'count' );
		$resultSet = $this->getSearchClient ()->select ( $query );

		$finalResult = $resultSet->getFacetSet ()->getFacets ();
		return $finalResult ['keywords']->getValues ();
	}
	public function addSortCodedPriceInRange($key,$fieldSortPrice,$criteria){
		$serviceGroupId = $criteria['service_group_id'];
		if($serviceGroupId == null){
        	$serviceGroupIdFlag = "";
        }
        else{
        	$serviceGroupIdFlag = $serviceGroupId."_";
        }
        for($i=$key;$i>=1;$i--)
        {
        	$priceField = 'coded_price_'.$serviceGroupIdFlag.($i) . '_f';
        	$fieldSortPrice .= "map(".$priceField. ", ".$criteria ['coded_min_price'].", ".$criteria ['coded_max_price'].", ".$priceField.", ";
        	$endBlock .= ")";
        }
        return rtrim($fieldSortPrice,", ").$endBlock;
		/* $priceField = 'price_'.$serviceGroupIdFlag.($key) . '_f';
		$fieldSortPrice .= "map(".$priceField. ", ".$criteria ['min_price'].", ".$criteria ['max_price'].", ";
		if($key-1 ===0){
			$fieldSortPrice .= "0,".$priceField."), ";	
			return $fieldSortPrice;
		}
		$fieldSortPrice = $this->addSortPriceInRange($key-1,$fieldSortPrice,$criteria);
		 //$fieldSortPrice .= "0,".$priceField.") ";
		$fieldSortPrice .= "".$priceField.") ";
		return $fieldSortPrice .= ($key!=7?",":""); */
	}
	public function addSortPriceInRange($key,$fieldSortPrice,$criteria){
		$serviceGroupId = $criteria['service_group_id'];
		if($serviceGroupId == null){
        	$serviceGroupIdFlag = "";
        }
        else{
        	$serviceGroupIdFlag = $serviceGroupId."_";
        }
        for($i=$key;$i>=1;$i--)
        {
        	$priceField = 'price_'.$serviceGroupIdFlag.($i) . '_f';
        	$fieldSortPrice .= "map(".$priceField. ", ".$criteria ['min_price'].", ".$criteria ['max_price'].", ".$priceField.", ";
        	$endBlock .= ")";
        }
        return rtrim($fieldSortPrice,", ").$endBlock;
		/* $priceField = 'price_'.$serviceGroupIdFlag.($key) . '_f';
		$fieldSortPrice .= "map(".$priceField. ", ".$criteria ['min_price'].", ".$criteria ['max_price'].", ";
		if($key-1 ===0){
			$fieldSortPrice .= "0,".$priceField."), ";	
			return $fieldSortPrice;
		}
		$fieldSortPrice = $this->addSortPriceInRange($key-1,$fieldSortPrice,$criteria);
		 //$fieldSortPrice .= "0,".$priceField.") ";
		$fieldSortPrice .= "".$priceField.") ";
		return $fieldSortPrice .= ($key!=7?",":""); */
	}
	// Sorting after applying quantity filter and shown price of that quantity : START

	public function addSortCodedPriceForQuantity($criteria){
		$serviceGroupId = $criteria['service_group_id'];
		if($serviceGroupId == null){
			$serviceGroupIdFlag = "";
		}
		else{
			$serviceGroupIdFlag = $serviceGroupId."_";
		}
		$fieldSortPrice = "sum(";
		for($i=1;$i<=$this->priceQtyRange;$i++)
		{
			$priceField = 'coded_price_'.$serviceGroupIdFlag.($i) . '_f';
			$minQtyField = 'coded_min_qty_'.$serviceGroupIdFlag.($i) . '_i';
			$maxQtyField = 'coded_max_qty_'.$serviceGroupIdFlag.($i) . '_i';
	
			$fieldSortPrice .= "if(and(map(".$minQtyField. ", 0, ".$criteria ['quantity'].", ".$priceField.",0),map(".$maxQtyField.", ".$criteria ['quantity'].",".self::MAX_QTY." , ".$priceField.",0)),".$priceField.",0),";
		}
		$fieldSortPrice = rtrim($fieldSortPrice,",");
		return $fieldSortPrice .= ")";
	
	}
	public function addSortPriceForQuantity($criteria){
		$serviceGroupId = $criteria['service_group_id'];
		if($serviceGroupId == null){
			$serviceGroupIdFlag = "";
		}
		else{
			$serviceGroupIdFlag = $serviceGroupId."_";
		}
		$fieldSortPrice = "sum(";
		for($i=1;$i<=$this->priceQtyRange;$i++)
		{
			$priceField = 'price_'.$serviceGroupIdFlag.($i) . '_f';
			$minQtyField = 'min_qty_'.$serviceGroupIdFlag.($i) . '_i';
			$maxQtyField = 'max_qty_'.$serviceGroupIdFlag.($i) . '_i';
				
			$fieldSortPrice .= "if(and(map(".$minQtyField. ", 0, ".$criteria ['quantity'].", ".$priceField.",0),map(".$maxQtyField.", ".$criteria ['quantity'].",".self::MAX_QTY." , ".$priceField.",0)),".$priceField.",0),";
		}
		$fieldSortPrice = rtrim($fieldSortPrice,",");
		return $fieldSortPrice .= ")";
		
	}
	// Sorting after applying quantity filter and shown price of that quantity : END
	
    public function createIndexWithChild($update, $product, $commit = true) {
        
        //1st Main Document
        $doc = $update->createDocument ();
        $doc->id = 1;
        $doc->title_txt = "Solr has block join support";
        $doc->content_type_txt = "parentDocument";
        $doc->quote_s = 'yes';
        $doc->instance_id_i = 1;
        $doc->is_feature_product_t = 'no';
        
        //Child document of 1st Main Document
        $doc1 = $update->createDocument ();
        $doc1->id = 2;
        $doc1->comments_txt = "SolrCloud supports it too!";
        $doc1->quote_s = 'yes';
        $doc1->instance_id_i = 1;
        $doc1->is_feature_product_t = 'no';
        
        $doc->childDoc = array($doc1);//EMP4464: Uncomment this line to add child document
        
        //Committing 1st Main Document
        $update -> addDocument($doc);
        $update -> addCommit();
        $this -> searchClient -> update($update);
        
        //2nd Main Document
        $doc = $update->createDocument ();
        $doc->id = 3;
        $doc->title_txt = "New Lucene and Solr release";
        $doc->content_type_txt = "parentDocument";
        $doc->quote_s = 'yes';
        $doc->instance_id_i = 1;
        $doc->is_feature_product_t = 'no';
        
        //Chld document of 2nd Main Document
        $doc1 = $update->createDocument ();
        $doc1->id = 4;
        $doc1->comments_txt = "Lots of new features";
        $doc1->quote_s = 'yes';
        $doc1->instance_id_i = 1;
        $doc1->is_feature_product_t = 'no';
        
        $doc->childDoc = array($doc1);//EMP4464: Uncomment this line to add child document
        
        //Committing 2nd Main Document
        $update -> addDocument($doc);
        $update -> addCommit();
        $this -> searchClient -> update($update);
    }
    



    /**
     * @author Employee Id: 4589
     * Description : Get discount code value from API
     *
     * @param 1 : Null
     *
     * @return type : codeArray
     *
     * @throws Exception: Null
     */
    public function applyDiscountCode($price,$code)
    {
    	if($this->priceInDecimal != 3)
    	{
    		$this->priceInDecimal = 3;
    	}
    	if(isset($price) && $price > 0 && isset($code) && $code != '')
    	{
    		$code = strtoupper($code);
    		
    		if ($this->discountCodes && !empty($this->discountCodes) && array_key_exists($code, $this->discountCodes) && $this->discountCodes [$code] > 0) {
    			$price = $price - ($price * ($this->discountCodes [$code] / 100));
    		}
    	}
    	$price = number_format($price,$this->priceInDecimal);
    	return $price;
    }
    /**
     * @author Employee Id: 4589
     * Description : Get discount code value from API
     *
     * @param 1 : Null
     *
     * @return type : codeArray
     *
     * @throws Exception: Null
     */
    public function getDiscountCodeArray()
    {
    
    	/* Redis cache processing started */
    	$locale=$this->request->getLocale();
    	$cacheSiteKey = array('discountcodeunique090520180542',$locale,$this->projectSetting['instance_id'],$this->container->getParameter('kernel.environment'));
    	
    	//print_r( $cacheSiteKey);exit;
    	$this->moduleCachePrefix='__SiteModuleHomePage__:';
    	$this->statsh_cache_wrapper=RedisCacheService::create();
    	//dump($this->statsh_cache_wrapper);exit;
    	$cacheKey = $this->moduleCachePrefix.RedisCacheService::generateKey($this->statsh_cache_wrapper,$cacheSiteKey);
    	
    	//echo $cacheKey;exit;
    	$cacheData = RedisCacheService::getCacheData($this->statsh_cache_wrapper,$cacheKey);
    	if($cacheData){
    		return $cacheData;
    	}
    	else
    	{    		
	    	//Add product API request
	    	$this->serviceGroupAPiClient->init('list_product_discount_code');
	    	$this->serviceGroupAPiClient->doProcess();
	    	$return = array();
	    	if ($this->serviceGroupAPiClient->isSuccess()) {
	    		$data = $this->serviceGroupAPiClient->getResultArray();
	    		if (isset($data['status']) && $data['status'] == "error") {
	    		} else {
	    			/* API processing ended */
	    			if(!empty($cacheKey))
	    			{
	    				RedisCacheService::saveCacheData($this->statsh_cache_wrapper,$cacheKey,$data);
	    			}
	    			return $data;
	    		}
	    	}
    	}
    	/* Redis cache processing ended */
    
    	return $return;
    }
}
