changeset 7960:fbab10c21e0b

Datacage: Make it possible to group a value tuple into more than one group.
author Sascha L. Teichmann <teichmann@intevation.de>
date Fri, 20 Jun 2014 16:26:26 +0200
parents 8e320b5933de
children e98ebf6585ad
files artifacts/doc/datacage_ref_de.rst artifacts/src/main/java/org/dive4elements/river/artifacts/datacage/templating/Builder.java
diffstat 2 files changed, 28 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/artifacts/doc/datacage_ref_de.rst	Fri Jun 20 13:45:54 2014 +0200
+++ b/artifacts/doc/datacage_ref_de.rst	Fri Jun 20 16:26:26 2014 +0200
@@ -407,6 +407,16 @@
       </marke>
     </marken>
 
+Der Expr-Ausdruck kann mittels der Zeichenfolge '#!#' innerhalb des Ausdrucks
+in mehrere Ausdrücke zerlegt werden. Damit ist es möglich, einen Wert
+in mehrere Kategorien einzusortieren. Wird z.B. ein Film über den Zeitraum
+von zwei Jahren gedreht und man möchte eine Liste von Filmen nach ihren
+Produktionsjahren gruppieren, sollte der Film im Resulat in beiden Jahren auftauchen.
+
+.. code:: xml
+
+    <dc:group expr="$start_jahr #!# $end_jahr">
+
 Datensätze auffalten
 ~~~~~~~~~~~~~~~~~~~~
 
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/datacage/templating/Builder.java	Fri Jun 20 13:45:54 2014 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/datacage/templating/Builder.java	Fri Jun 20 16:26:26 2014 +0200
@@ -54,6 +54,9 @@
 {
     private static Logger log = Logger.getLogger(Builder.class);
 
+    public static final Pattern MAGIC_EXPR_SEPARATOR =
+        Pattern.compile("#!#");
+
     public static final Pattern STRIP_LINE_INDENT =
         Pattern.compile("\\s*\\r?\\n\\s*");
 
@@ -506,9 +509,14 @@
             List<Object []> rows = rd.getRows();
             String [] columns = rd.getColumnLabels();
 
-            XPathExpression x;
+            String [] exprs = MAGIC_EXPR_SEPARATOR.split(expr);
+
+            XPathExpression [] xs = new XPathExpression[exprs.length];
+
             try {
-                x = getXPathExpression(expr);
+                for (int i = 0; i < exprs.length; ++i) {
+                    xs[i] = getXPathExpression(exprs[i]);
+                }
             }
             catch (XPathExpressionException xee) {
                 log.warn("Invalid expression '" + expr + "'.");
@@ -524,16 +532,16 @@
                 try {
                     frames.put(columns, row);
 
-                    Object key = x.evaluate(EVAL_DOCUMENT, returnType);
-
-                    ResultData group = groups.get(key);
+                    for (XPathExpression x: xs) {
+                        Object key = x.evaluate(EVAL_DOCUMENT, returnType);
+                        ResultData group = groups.get(key);
 
-                    if (group == null) {
-                        group = new ResultData(rd.getColumnLabels());
-                        groups.put(key, group);
+                        if (group == null) {
+                            group = new ResultData(rd.getColumnLabels());
+                            groups.put(key, group);
+                        }
+                        group.add(row);
                     }
-
-                    group.add(row);
                 }
                 catch (XPathExpressionException xxe) {
                     log.warn("unable to apply expression '" +

http://dive4elements.wald.intevation.org