protected function initEntityQuery() { $tag = "ListDrafter: initEntityQuery()"; Log::debug("$tag"); // convenience pointeres $entityBP = $this->entityBlueprint; $listBP = $this->listBlueprint; /* // Build an entity query */ $query = new EntityQuery($this->entityBlueprint); // where $where = ""; if(array_key_exists("where", $this->params)) { $query->where($this->params["where"]); } // process filters $sessionFilters = Session::user("_CONDUIT_FILTERS"); if( (!empty($sessionFilters)) && (is_array($sessionFilters)) && (count($sessionFilters)>0) ) { $filterKeys = array_keys($sessionFilters); foreach($filterKeys as $keyPath) { Log::debug("$tag: Considering filter: $keyPath"); $filter = $sessionFilters["$keyPath"]; $fieldKey = $filter->getKey(); $blueprintKey = $filter->getBlueprintKey(); // should this filter be applied to our list? $applyFilter = false; // does this filter apply to our entity? if($blueprintKey == $entityBP->getKey()) { if($listBP) { if($listBP->keyExists($fieldKey)) { $applyFilter = true; } } else if($entityBP->keyExists($fieldKey)) { $applyFilter = true; } } if( ($applyFilter) && ($filter->hasValue()) ) { Log::debug("$tag: Applying filter: $keyPath"); switch($filter->dataType) { case "string": case "text": case "enum": switch($filter->type) { case "like": $like = $filter->value["like"]; $query->where("$keyPath LIKE '%$like%'"); break; case "equals": $equals = $filter->value["equals"]; $query->where("$keyPath='$equals'"); break; } break; case "int": switch($filter->type) { case "equals": $equals = $filter->value["equals"]; $query->where("$keyPath=$equals"); break; case "min": $min = $filter->value["min"]; $query->where("$keyPath>=$min"); break; case "max": $max = $filter->value["max"]; $query->where("$keyPath<=$max"); break; case "range": $min = $filter->value["min"]; $max = $filter->value["max"]; if( (!empty($min) || $min==0) && (!empty($max) || $max==0) ) $query->where("( ($keyPath>=$min) AND ($keyPath<=$max) )"); else if( (!empty($min) || $min==0) ) $query->where("$keyPath>=$min"); else $query->where("$keyPath<=$max"); break; } break; case "decimal": case "date": case "datetime": switch($filter->type) { case "equals": $equals = $filter->value["equals"]; $query->where("$keyPath='$equals'"); break; case "min": $min = $filter->value["min"]; $query->where("$keyPath>='$min'"); break; case "max": $max = $filter->value["max"]; $query->where("$keyPath<='$max'"); break; case "range": $min = $filter->value["min"]; $max = $filter->value["max"]; if( !empty($min) && !empty($max) ) $query->where("( ($keyPath>='$min') AND ($keyPath<='$max') )"); else if( !empty($min) ) $query->where("$keyPath>='$min'"); else $query->where("$keyPath<='$max'"); break; } break; } // END: switch($filter->dataType) } // END: if($applyFilter) } // END: foreach($filterKeys as $keyPath) } // END: if( (!empty($sessionFilters)) && (is_array($sessionFilters)) && (count($sessionFilters)>0) ) // ORDER BY if(array_key_exists("order", $this->params)) { $order = $this->params["order"]; if(is_array($order)) { foreach($order as $o) { $query->order($o); } } else { $query->order($order); } } // LIMIT (PAGING) if(array_key_exists("page", $this->params)) { // Init page number $page = 1; if( (is_int($this->params["page"])) && ($this->params["page"]>=1) ) $page = $this->params["page"]; // Init page limit $page_limit = 20; // default if( (array_key_exists("page_limit", $this->params)) && (is_int((int) $this->params["page_limit"])) && ($this->params["page_limit"]>=1) ) $page_limit = $this->params["page_limit"]; else $this->params["page_limit"] = $page_limit; // init default for use by javascript // Calculate OFFSET (First row offset=0) $page_offset = ($page-1) * $page_limit; // Count the total number of rows that this query will produce (without LIMITs) $countQuery = clone $query; $countQuery->select("COUNT(*) AS count", true); $sql = new DatabaseQuery($countQuery->toString()); try { $sql->doQuery(); $row = $sql->get_next_row(); $count = $row->count; Log::debug("$tag: COUNT = $count"); // Save "count" to params (for use by javascript) $this->params["count"] = (int) $count; } catch(Exception $e) { Log::error("$tag: Caught: " . $e->getMessage()); } // Add LIMIT clause to query $query->limit("$page_offset, $page_limit"); } $this->entityQuery = $query; }