5 use Doctrine\DBAL\Query\Expression\CompositeExpression;
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');
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) {
186 $join->prepare(
$qb,
$qb->getTableAlias());
189 foreach ($this->options->wheres as $where) {
190 $ands[] = $where->prepare(
$qb,
$qb->getTableAlias());
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) {
240 $parts[] = $clause->prepare(
$qb,
$qb->getTableAlias());
243 return $qb->merge($parts, $boolean);
259 foreach ($clauses as $clause) {
260 if (strtoupper($boolean) ===
'OR' ||
count($clauses) === 1) {
263 $joined_alias =
$qb->joinMetadataTable(
$qb->getTableAlias(),
'entity_guid', $clause->names);
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;
287 if (strtoupper($boolean) ===
'OR' ||
count($clauses) === 1) {
290 $joined_alias =
$qb->joinRelationshipTable(
$qb->getTableAlias(), $join_on, $clause->names, $clause->inverse);
293 $parts[] = $clause->prepare(
$qb, $joined_alias);
296 return $qb->merge($parts, $boolean);
Annotation repository contains methods for fetching annotations from database or performing calculati...
buildPairedMetadataClause(QueryBuilder $qb, $clauses, $boolean='AND')
Process metadata name value pairs Joins metadata table on entity_guid in the annotations table and ap...
buildQuery(QueryBuilder $qb)
Build a database query.
buildPairedRelationshipClause(QueryBuilder $qb, $clauses, $boolean='AND')
Process relationship name value pairs Joins relationship table on entity_guid in the annotations tabl...
execute()
Execute the query resolving calculation, count and/or batch options.
buildPairedAnnotationClause(QueryBuilder $qb, $clauses, $boolean='AND')
Process annotation name value pairs Applies where clauses to the selected annotation table.
calculate($function, $property, $property_type=null)
Performs a mathematical calculation on metadata or metadata entity's properties.
buildEntityWhereClause(QueryBuilder $qb)
Process entity attribute wheres Joins entities table on entity guid in annotations table and applies ...
Builds queries for matching annotations against their properties.
Builds queries for filtering entities by their properties in the entities table.
Builds clauses for filtering entities by their properties in entity_relationships table.
Database abstraction query builder.
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.
batch($limit=null, $offset=null, $callback=null)
Fetch rows as an ElggBatch.
static fromTable(string $table, ?string $alias=null)
Returns a QueryBuilder for selecting data from a given table.
Exception thrown if a value does not adhere to a defined valid data domain.
Exception thrown if an argument is not of the expected type.
Exception that represents error in the program logic.
if($item instanceof \ElggEntity) elseif($item instanceof \ElggRiverItem) elseif($item instanceof \ElggRelationship) elseif(is_callable([ $item, 'getType']))
_elgg_services()
Get the global service provider.
elgg_extract($key, $array, $default=null, bool $strict=true)
Checks for $array[$key] and returns its value if it exists, else returns $default.