From: Christian Weiske Date: Fri, 28 Feb 2025 11:45:03 +0000 (+0100) Subject: Elastic: Properly display sparse result rows X-Git-Tag: v5.0.3~29 X-Git-Url: https://git.joonet.de/?a=commitdiff_plain;h=fde7d7dde2ffd57f9e18cbc7328073ad8b34e95d;p=adminer.git Elastic: Properly display sparse result rows Result records in Elasticsearch do not always have all columns that are defined in an index. This often happens when multiple document types are stored in the same index. The first row has columns ["_id", "html", "url"], while the second misses the "html" column: ["_id", "url"]. Adminer expects that all result rows include all columns. This leads to the problem that the "url" value in the 2nd example row was rendered in the "html" column. This patch fixes this problem by fetching the actual column list first when all fields are to be shown, and using that field list as base for all rows. --- diff --git a/plugins/drivers/elastic.php b/plugins/drivers/elastic.php index 29d46651..a11dd64f 100644 --- a/plugins/drivers/elastic.php +++ b/plugins/drivers/elastic.php @@ -205,6 +205,9 @@ if (isset($_GET["elastic"])) { if (empty($search)) { return false; } + if ($select == array("*")) { + $tableFields = array_keys(fields($table)); + } $return = array(); foreach ($search["hits"]["hits"] as $hit) { @@ -219,7 +222,9 @@ if (isset($_GET["elastic"])) { $fields[$key] = $key == "_id" ? $hit["_id"] : $hit["_source"][$key]; } } else { - $fields = $hit["_source"]; + foreach ($tableFields as $key) { + $fields[$key] = $key == "_id" ? $hit["_id"] : $hit["_source"][$key]; + } } foreach ($fields as $key => $val) { $row[$key] = (is_array($val) ? json_encode($val) : $val);