ok, diff -u This time against HEAD and tested. I included minimal xspdoc:desc documentation.
This patch adds esql:group and esql:member to esql and supporting fields to EsqlQuery. That way, you can do a single query using join syntax, often eliminating the need to do nested queries. <h1>The League</h1> <esql:row-results> <esql:group group-on="team"> <h2><esql:get-string column="team"></h2> <ul> <esql:member> <li><esql:get-string column="player"/></li> </esql:member> </ul> </esql:group> </esql:row-results> Nested groups to any level are allowed. I was having trouble with the cvs cocoon. It always freezes at some point in the pipeline when using automounted home directories. I don't know if mount is causing the problem or if my subsitemaps are. it freezes trying to transform something in the subsitemap. I ended up moving a test xsp into the sample xsp directory which worked fine. Tim Myers
Index: esql.xsl =================================================================== RCS file: /home/cvspublic/xml-cocoon2/src/org/apache/cocoon/components/language/markup/xsp/java/esql.xsl,v retrieving revision 1.23 diff -u -r1.23 esql.xsl --- esql.xsl 2001/11/19 15:23:53 1.23 +++ esql.xsl 2001/11/20 03:54:39 @@ -583,15 +583,20 @@ </xsl:template> <xsl:template match="esql:results//esql:row-results"> + <xsl:variable name="group" select=".//esql:group"/> <xsp:logic> + + //create booleans for group change watches and strings for old values. + <xsl:apply-templates select=".//esql:group" mode="vars"/> + do { - <xsp:content> + <xsp:content> <xsl:apply-templates/> - </xsp:content> - if (_esql_query.getMaxRows() != -1 && _esql_query.getCurrentRow() - _esql_query.getSkipRows() == _esql_query.getMaxRows() - 1 ) { - break; - } - } while (_esql_query.nextRow()); + </xsp:content> + <xsl:if test="count($group) < 1"> + <xsl:call-template name="nextRow"/> + </xsl:if> + } while ( _esql_query.keepGoing() ); if (_esql_query.getSkipRows() > 0 ) { <xsl:apply-templates select="ancestor::esql:results//esql:previous-results" mode="more"/> @@ -603,12 +608,73 @@ </xsp:logic> </xsl:template> +<xsl:template name="nextRow"> + //checking out early? + if (_esql_query.getMaxRows() != -1 && _esql_query.getCurrentRow() - +_esql_query.getSkipRows() == _esql_query.getMaxRows() - 1 ) { + } else { //if not, advance normally + _esql_query.setKeepGoing( _esql_query.nextRow() ); + } +</xsl:template> + <xsl:template match="esql:results//esql:previous-results"/> <xsl:template match="esql:results//esql:previous-results" mode="more"> <xsp:content> <xsl:apply-templates/> </xsp:content> +</xsl:template> + +<xsl:template match="esql:group" mode="vars"> + _esql_query.setGroupingVar("<xsl:value-of select="@group-on"/>Changed", new +Boolean(true)); +</xsl:template> + +<xspdoc:desc>Allows header and footer elements around groups of consecutive records +with identical values in column named by @group-on. Facilitates a single query with +joins to be used in lieu of some nested queries.</xspdoc:desc> +<xsl:template match="esql:group|esql:group//esql:group[.//esql:member]" priority="3"> +<xsp:logic> + if (((Boolean)_esql_query.getGroupingVar("<xsl:value-of +select="@group-on"/>Changed")).booleanValue()){ + //header contents + <xsp:content> + <xsl:apply-templates> + <xsl:with-param name="group-on" select="@group-on"/> + </xsl:apply-templates> + </xsp:content> + } +</xsp:logic> +</xsl:template> + +<xsl:template match="esql:group//node()[.//esql:member]"> + <xsl:param name="group-on"/> + <xsl:copy> + <xsl:apply-templates select="@*|*|text()"> + <xsl:with-param name="group-on" select="$group-on"/> + </xsl:apply-templates> + </xsl:copy> +</xsl:template> + +<xspdoc:desc>Used in conjunction with and nested inside esql:group. Formatting for +individual records goes within esql:member. Header and footer stuff goes in between +group and member.</xspdoc:desc> +<xsl:template match="esql:member|esql:group//esql:member[.//esql:member]"> + <xsl:param name="group-on"/> + <xsl:variable name="group" select=".//esql:group"/> + <xsp:logic> + } + _esql_query.setGroupingVar("<xsl:value-of select="$group-on"/>Old", +_esql_query.getResultSet().getString("<xsl:value-of select="$group-on"/>")); + <xsp:content> + <xsl:apply-templates> + <xsl:with-param name="group-on" select="$group-on"/> + </xsl:apply-templates> + </xsp:content> + + <xsl:if test="count($group) < 1"> + <xsl:call-template name="nextRow"/> + </xsl:if> + if ( _esql_query.keepGoing() ) { + _esql_query.setGroupingVar("<xsl:value-of select="$group-on"/>Changed", new +Boolean(!((String)_esql_query.getGroupingVar("<xsl:value-of +select="$group-on"/>Old")).equals(_esql_query.getResultSet().getString("<xsl:value-of +select="$group-on"/>")))); + } else { + _esql_query.setGroupingVar("<xsl:value-of select="$group-on"/>Changed", new +Boolean(true)); + } + if (((Boolean)_esql_query.getGroupingVar("<xsl:value-of +select="$group-on"/>Changed")).booleanValue()) { + //footer contents + </xsp:logic> </xsl:template> <xsl:template match="esql:results//esql:more-results"/>
Index: EsqlQuery.java =================================================================== RCS file: /home/cvspublic/xml-cocoon2/src/org/apache/cocoon/components/language/markup/xsp/EsqlQuery.java,v retrieving revision 1.3 diff -u -r1.3 EsqlQuery.java --- EsqlQuery.java 2001/10/26 11:31:33 1.3 +++ EsqlQuery.java 2001/11/20 03:20:50 @@ -33,6 +33,8 @@ private int position = -1; private int maxRows = -1; private int skipRows = 0; + private boolean keepgoing = true; + private java.util.Hashtable groupingVars = new java.util.Hashtable(); private String query; private int limitMethod; @@ -128,6 +130,22 @@ position++; return(resultSet.next()); } + + public boolean keepGoing() { + return(keepgoing); + } + + public void setKeepGoing( boolean still ) { + keepgoing = still; + } + + public Object setGroupingVar( String key, Object value) { + return groupingVars.put(key,value); + } + + public Object getGroupingVar( String key) { + return groupingVars.get(key); + } public ResultSetMetaData getResultSetMetaData() { return(resultSetMetaData);
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, email: [EMAIL PROTECTED]