28 $count_expr = $this->options->distinct ?
"DISTINCT {$qb->getTableAlias()}.id" :
'*';
29 $qb->select(
"COUNT({$count_expr}) AS total");
52 public function calculate($function, $property, $property_type = null) {
54 throw new DomainException(
"'{$function}' is not a valid numeric function");
57 if (!isset($property_type)) {
58 $property_type =
'annotation';
63 switch ($property_type) {
70 $qb->select(
"{$function}({$alias}.{$property}) AS calculation");
75 if (!empty($this->options->annotation_name_value_pairs) && $this->options->annotation_name_value_pairs[0]->names != $property) {
76 $alias =
$qb->joinAnnotationTable(
$qb->getTableAlias(),
'entity_guid', $property);
79 $qb->select(
"{$function}({$alias}.value) AS calculation");
83 $alias =
$qb->joinMetadataTable(
$qb->getTableAlias(),
'entity_guid', $property);
84 $qb->select(
"{$function}({$alias}.value) AS calculation");
107 $distinct = $this->options->distinct ?
'DISTINCT ' :
'';
108 $qb->select(
"{$distinct}{$qb->getTableAlias()}.*");
115 $original_order =
elgg_extract(
'order_by', $this->options->__original_options);
116 if (empty($this->options->order_by) && $original_order !==
false) {
117 $qb->addOrderBy(
"{$qb->getTableAlias()}.time_created",
'asc');
118 $qb->addOrderBy(
"{$qb->getTableAlias()}.id",
'asc');
122 $qb->setMaxResults((
int)
$limit);
123 $qb->setFirstResult((
int) $offset);
126 $callback = $callback ?: $this->options->callback;
127 if (!isset($callback)) {
128 $callback =
function ($row) {
129 return new \ElggAnnotation($row);
134 if (!empty(
$results) && $this->options->preload_owners) {
148 if ($this->options->annotation_calculation) {
149 $clauses = $this->options->annotation_name_value_pairs;
150 if (
count($clauses) > 1 && $this->options->annotation_name_value_pairs_operator !==
'OR') {
151 throw new LogicException(
'Annotation calculation can not be performed on multiple annotation name value pairs merged with AND');
154 $clause = array_shift($clauses);
156 return $this->
calculate($this->options->annotation_calculation, $clause->names,
'annotation');
157 }
elseif ($this->options->metadata_calculation) {
158 $clauses = $this->options->metadata_name_value_pairs;
159 if (
count($clauses) > 1 && $this->options->metadata_name_value_pairs_operator !==
'OR') {
160 throw new LogicException(
'Metadata calculation can not be performed on multiple metadata name value pairs merged with AND');
163 $clause = array_shift($clauses);
165 return $this->
calculate($this->options->metadata_calculation, $clause->names,
'metadata');
166 }
elseif ($this->options->count) {
167 return $this->
count();
168 }
elseif ($this->options->batch) {
169 return $this->
batch($this->options->limit, $this->options->offset, $this->options->callback);
171 return $this->
get($this->options->limit, $this->options->offset, $this->options->callback);
185 foreach ($this->options->joins as $join) {
189 foreach ($this->options->wheres as $where) {
193 $ands[] = $this->
buildPairedAnnotationClause($qb, $this->options->annotation_name_value_pairs, $this->options->annotation_name_value_pairs_operator);
195 $ands[] = $this->
buildPairedMetadataClause($qb, $this->options->metadata_name_value_pairs, $this->options->metadata_name_value_pairs_operator);
199 $ands = $qb->
merge($ands);
202 $qb->andWhere($ands);
218 return EntityWhereClause::factory($this->options)->prepare($qb, $joined_alias);
234 if (empty($clauses)) {
239 foreach ($clauses as $clause) {
243 return $qb->
merge($parts, $boolean);
259 foreach ($clauses as $clause) {
266 $parts[] = $clause->prepare($qb, $joined_alias);
269 return $qb->
merge($parts, $boolean);
285 foreach ($clauses as $clause) {
286 $join_on = $clause->join_on ==
'guid' ?
'entity_guid' : $clause->join_on;
293 $parts[] = $clause->prepare($qb, $joined_alias);
296 return $qb->
merge($parts, $boolean);
buildPairedAnnotationClause(QueryBuilder $qb, $clauses, $boolean= 'AND')
Process annotation name value pairs Applies where clauses to the selected annotation table...
batch($limit=null, $offset=null, $callback=null)
Fetch rows as an ElggBatch.
buildPairedRelationshipClause(QueryBuilder $qb, $clauses, $boolean= 'AND')
Process relationship name value pairs Joins relationship table on entity_guid in the annotations tabl...
calculate($function, $property, $property_type=null)
Performs a mathematical calculation on metadata or metadata entity's properties.
Exception thrown if a value does not adhere to a defined valid data domain.
Database abstraction query builder.
Builds queries for matching annotations against their properties.
if($item instanceof\ElggEntity) elseif($item instanceof\ElggRiverItem) elseif($item instanceof\ElggRelationship) elseif(is_callable([$item, 'getType']))
buildPairedMetadataClause(QueryBuilder $qb, $clauses, $boolean= 'AND')
Process metadata name value pairs Joins metadata table on entity_guid in the annotations table and ap...
elgg_extract($key, $array, $default=null, bool $strict=true)
Checks for $array[$key] and returns its value if it exists, else returns $default.
Abstract methods for interfacing with the database.
expandInto(QueryBuilder $qb, $table_alias=null)
Extend query builder with select, group_by, having and order_by clauses from $options.
Exception that represents error in the program logic.
joinEntitiesTable(string $from_alias= '', string $from_column= 'guid',?string $join_type= 'inner', string $joined_alias=null)
Join entity table from alias and return joined table alias.
joinRelationshipTable(string $from_alias= '', string $from_column= 'guid', $name=null, bool $inverse=false,?string $join_type= 'inner', string $joined_alias=null)
Join relationship table from alias and return joined table alias.
joinMetadataTable(string $from_alias= '', string $from_column= 'guid', $name=null,?string $join_type= 'inner', string $joined_alias=null)
Join metadata table from alias and return joined table alias.
execute()
Execute the query resolving calculation, count and/or batch options.
getTableAlias()
Returns the alias of the primary table.
merge($parts=null, $boolean= 'AND')
Merges multiple composite expressions with a boolean.
buildQuery(QueryBuilder $qb)
Build a database query.
static fromTable(string $table, string $alias=null)
Returns a QueryBuilder for selecting data from a given table.
_elgg_services()
Get the global service provider.
Annotation repository contains methods for fetching annotations from database or performing calculati...
buildEntityWhereClause(QueryBuilder $qb)
Process entity attribute wheres Joins entities table on entity guid in annotations table and applies ...