5 use Doctrine\DBAL\Query\Expression\CompositeExpression;
27 $count_expr = $this->options->distinct ?
"DISTINCT {$qb->getTableAlias()}.id" :
'*';
28 $qb->select(
"COUNT({$count_expr}) AS total");
51 public function calculate($function, $property, $property_type =
null) {
53 throw new DomainException(
"'{$function}' is not a valid numeric function");
56 if (!isset($property_type)) {
57 $property_type =
'annotation';
62 switch ($property_type) {
69 $qb->select(
"{$function}({$alias}.{$property}) AS calculation");
74 if (!empty($this->options->annotation_name_value_pairs) && $this->options->annotation_name_value_pairs[0]->names != $property) {
75 $alias =
$qb->joinAnnotationTable(
$qb->getTableAlias(),
'entity_guid', $property);
78 $qb->select(
"{$function}({$alias}.value) AS calculation");
82 $alias =
$qb->joinMetadataTable(
$qb->getTableAlias(),
'entity_guid', $property);
83 $qb->select(
"{$function}({$alias}.value) AS calculation");
106 $distinct = $this->options->distinct ?
'DISTINCT ' :
'';
107 $qb->select(
"{$distinct}{$qb->getTableAlias()}.*");
114 $original_order =
elgg_extract(
'order_by', $this->options->__original_options);
115 if (empty($this->options->order_by) && $original_order !==
false) {
116 $qb->addOrderBy(
"{$qb->getTableAlias()}.time_created",
'asc');
117 $qb->addOrderBy(
"{$qb->getTableAlias()}.id",
'asc');
125 $callback = $callback ?: $this->options->callback;
126 if (!isset($callback)) {
127 $callback =
function ($row) {
128 return new \ElggAnnotation($row);
133 if (!empty(
$results) && $this->options->preload_owners) {
147 if ($this->options->annotation_calculation) {
148 $clauses = $this->options->annotation_name_value_pairs;
149 if (
count($clauses) > 1 && $this->options->annotation_name_value_pairs_operator !==
'OR') {
150 throw new LogicException(
'Annotation calculation can not be performed on multiple annotation name value pairs merged with AND');
153 $clause = array_shift($clauses);
155 return $this->
calculate($this->options->annotation_calculation, $clause->names,
'annotation');
156 }
elseif ($this->options->metadata_calculation) {
157 $clauses = $this->options->metadata_name_value_pairs;
158 if (
count($clauses) > 1 && $this->options->metadata_name_value_pairs_operator !==
'OR') {
159 throw new LogicException(
'Metadata calculation can not be performed on multiple metadata name value pairs merged with AND');
162 $clause = array_shift($clauses);
164 return $this->
calculate($this->options->metadata_calculation, $clause->names,
'metadata');
165 }
elseif ($this->options->count) {
166 return $this->
count();
167 }
elseif ($this->options->batch) {
168 return $this->
batch($this->options->limit, $this->options->offset, $this->options->callback);
170 return $this->
get($this->options->limit, $this->options->offset, $this->options->callback);
184 foreach ($this->options->joins as $join) {
185 $join->prepare(
$qb,
$qb->getTableAlias());
188 foreach ($this->options->wheres as $where) {
189 $ands[] = $where->prepare(
$qb,
$qb->getTableAlias());
192 $ands[] = $this->
buildPairedAnnotationClause($qb, $this->options->annotation_name_value_pairs, $this->options->annotation_name_value_pairs_operator);
194 $ands[] = $this->
buildPairedMetadataClause($qb, $this->options->metadata_name_value_pairs, $this->options->metadata_name_value_pairs_operator);
198 $ands =
$qb->merge($ands);
201 $qb->andWhere($ands);
217 return EntityWhereClause::factory($this->options)->prepare(
$qb, $joined_alias);
233 if (empty($clauses)) {
238 foreach ($clauses as $clause) {
239 $parts[] = $clause->prepare(
$qb,
$qb->getTableAlias());
242 return $qb->merge($parts, $boolean);
258 foreach ($clauses as $clause) {
259 if (strtoupper($boolean) ===
'OR' ||
count($clauses) === 1) {
262 $joined_alias =
$qb->joinMetadataTable(
$qb->getTableAlias(),
'entity_guid', $clause->names);
265 $parts[] = $clause->prepare(
$qb, $joined_alias);
268 return $qb->merge($parts, $boolean);
284 foreach ($clauses as $clause) {
285 $join_on = $clause->join_on ==
'guid' ?
'entity_guid' : $clause->join_on;
286 if (strtoupper($boolean) ===
'OR' ||
count($clauses) === 1) {
289 $joined_alias =
$qb->joinRelationshipTable(
$qb->getTableAlias(), $join_on, $clause->names, $clause->inverse);
292 $parts[] = $clause->prepare(
$qb, $joined_alias);
295 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 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.