You are viewing a plain text version of this content. The canonical link for it is here.
Posted to derby-commits@db.apache.org by rh...@apache.org on 2013/06/18 14:29:59 UTC

svn commit: r1494115 - in /db/derby/code/trunk/java/engine/org/apache/derby: iapi/sql/ impl/sql/execute/

Author: rhillegas
Date: Tue Jun 18 12:29:58 2013
New Revision: 1494115

URL: http://svn.apache.org/r1494115
Log:
DERBY-6266: Add ability to print Derby execution ResultSet graph as xml.

Modified:
    db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/ResultSet.java
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/BasicNoPutResultSetImpl.java
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/DependentResultSet.java
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/HashScanResultSet.java
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/LastIndexKeyResultSet.java
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/NoRowsResultSetImpl.java
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/ScanResultSet.java
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/TableScanResultSet.java
    db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/TemporaryRowHolderResultSet.java

Modified: db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/ResultSet.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/ResultSet.java?rev=1494115&r1=1494114&r2=1494115&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/ResultSet.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/iapi/sql/ResultSet.java Tue Jun 18 12:29:58 2013
@@ -29,6 +29,7 @@ import org.apache.derby.iapi.sql.Row;
 
 import java.sql.Timestamp;
 import java.sql.SQLWarning;
+import org.w3c.dom.Element;
 
 /**
  * The ResultSet interface provides a method to tell whether a statement
@@ -347,4 +348,18 @@ public interface ResultSet
 		this result set. The warnings are cleared once this call returns.
 	*/
 	public SQLWarning getWarnings();
+    
+	/**
+	 * <p>
+     * Produce an xml image of this ResultSet and its descendant ResultSets.
+     * Appends an element to the parentNode and returns the appended element.
+     * </p>
+     *
+     * @param   parentNode  Node to put content into.
+     * @param   tag             Element tag for content
+     *
+     * @return  the content as an element with the given tag name
+	 */
+	public Element toXML( Element parentNode, String tag ) throws Exception;
+
 }

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/BasicNoPutResultSetImpl.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/BasicNoPutResultSetImpl.java?rev=1494115&r1=1494114&r2=1494115&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/BasicNoPutResultSetImpl.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/BasicNoPutResultSetImpl.java Tue Jun 18 12:29:58 2013
@@ -21,8 +21,13 @@
 
 package org.apache.derby.impl.sql.execute;
 
+import java.lang.reflect.Field;
 import java.sql.SQLWarning;
 import java.sql.Timestamp;
+import java.util.Arrays;
+import java.util.ArrayList;
+import java.util.Comparator;
+import org.w3c.dom.Element;
 
 import org.apache.derby.iapi.error.StandardException;
 import org.apache.derby.iapi.reference.SQLState;
@@ -1043,4 +1048,82 @@ implements NoPutResultSet
 		warnings = null;
 		return w;
 	}
+
+    public Element toXML( Element parentNode, String tag ) throws Exception
+    {
+        return childrenToXML( toXML( parentNode, tag, this ), this );
+    }
+
+    /**
+     * <p>
+     * Pretty-print a ResultSet as an xml child of a parent node.
+     * Return the node representing the ResultSet child.
+     * </p>
+     */
+    public  static  Element    toXML( Element parentNode, String childTag, ResultSet rs ) throws Exception
+    {
+        String  childClassName = rs.getClass().getName();
+        String  typeAttribute = childClassName.substring( childClassName.lastIndexOf( "." ) + 1 );
+        Element result = parentNode.getOwnerDocument().createElement( childTag );
+        result.setAttribute( "type", typeAttribute );
+
+        parentNode.appendChild( result );
+        return result;
+    }
+
+    /**
+     * <p>
+     * Pretty-print the inner ResultSet fields inside an outer ResultSet.
+     * Returns the outerNode.
+     * </p>
+     */
+    public  static  Element    childrenToXML
+        ( Element outerNode, ResultSet outerRS ) throws Exception
+    {
+        ArrayList<Field>    fieldList = new ArrayList<Field>();
+        findResultSetFields( fieldList, outerRS.getClass() );
+
+        //
+        // Get a array of all the ResultSet fields inside the outerRS,
+        // ordered by field name.
+        //
+        Field[] fields = new Field[ fieldList.size() ];
+        fieldList.toArray( fields );
+        Arrays.sort( fields, new FieldComparator() );
+
+        // Add those fields as children of the outer element.
+        for ( Field field : fields )
+        {
+            ResultSet   innerRS = (ResultSet) field.get( outerRS );
+
+            if ( innerRS != null) { innerRS.toXML( outerNode, field.getName() ); }
+        }
+
+        return outerNode;
+    }
+
+    /**
+     * <p>
+     * Find all fields of type ResultSet.
+     * </p>
+     */
+    private static  void    findResultSetFields( ArrayList<Field> fieldList, Class<?> klass )
+        throws Exception
+    {
+        if ( klass == null ) { return; }
+        
+        Field[] fields = klass.getDeclaredFields();
+
+        for ( Field field : fields )
+        {
+            if ( ResultSet.class.isAssignableFrom( field.getType() ) ) { fieldList.add( field ); }
+        }
+
+        findResultSetFields( fieldList, klass.getSuperclass() );
+    }
+
+    public  static  final   class   FieldComparator implements Comparator<Field>
+    {
+        public  int compare( Field left, Field right ) { return left.getName().compareTo( right.getName() ); }
+    }
 }

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/DependentResultSet.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/DependentResultSet.java?rev=1494115&r1=1494114&r2=1494115&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/DependentResultSet.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/DependentResultSet.java Tue Jun 18 12:29:58 2013
@@ -23,6 +23,7 @@ package org.apache.derby.impl.sql.execut
 
 import java.util.Properties;
 import java.util.Vector;
+import org.w3c.dom.Element;
 
 import org.apache.derby.iapi.error.StandardException;
 import org.apache.derby.iapi.reference.SQLState;
@@ -94,9 +95,7 @@ class DependentResultSet extends ScanRes
 	protected int startSearchOperator;
 	protected int stopSearchOperator;
 	protected Qualifier[][] qualifiers;
-	public String tableName;
 	public String userSuppliedOptimizerOverrides;
-	public String indexName;
 	protected boolean runTimeStatisticsOn;
 	public int rowsPerRead;
 	public boolean forUpdate;
@@ -693,6 +692,7 @@ class DependentResultSet extends ScanRes
 		String idt = "";
 		return idt + MessageService.getTextMessage(SQLState.LANG_NONE);
 	}
+
 }
 
 

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/HashScanResultSet.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/HashScanResultSet.java?rev=1494115&r1=1494114&r2=1494115&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/HashScanResultSet.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/HashScanResultSet.java Tue Jun 18 12:29:58 2013
@@ -82,9 +82,7 @@ public class HashScanResultSet extends S
 	private int initialCapacity;
 	private float loadFactor;
 	private int maxCapacity;
-	public String tableName;
 	public String userSuppliedOptimizerOverrides;
-	public String indexName;
 	public boolean forUpdate;
 	private boolean runTimeStatisticsOn;
 	public int[] keyColumns;

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/LastIndexKeyResultSet.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/LastIndexKeyResultSet.java?rev=1494115&r1=1494114&r2=1494115&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/LastIndexKeyResultSet.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/LastIndexKeyResultSet.java Tue Jun 18 12:29:58 2013
@@ -43,9 +43,7 @@ class LastIndexKeyResultSet extends Scan
 	protected int startSearchOperator;
 	protected int stopSearchOperator;
 	protected Qualifier[][] qualifiers;
-	public String tableName;
 	public String userSuppliedOptimizerOverrides;
-	public String indexName;
 	protected boolean runTimeStatisticsOn;
 
 	// Run time statistics

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/NoRowsResultSetImpl.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/NoRowsResultSetImpl.java?rev=1494115&r1=1494114&r2=1494115&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/NoRowsResultSetImpl.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/NoRowsResultSetImpl.java Tue Jun 18 12:29:58 2013
@@ -23,6 +23,7 @@ package org.apache.derby.impl.sql.execut
 
 import java.sql.SQLWarning;
 import java.sql.Timestamp;
+import org.w3c.dom.Element;
 
 import org.apache.derby.iapi.error.StandardException;
 import org.apache.derby.iapi.reference.SQLState;
@@ -766,4 +767,9 @@ abstract class NoRowsResultSetImpl imple
 		return null;
 	}
 
+    public Element toXML( Element parentNode, String tag ) throws Exception
+    {
+        return BasicNoPutResultSetImpl.childrenToXML( BasicNoPutResultSetImpl.toXML( parentNode, tag, this ), this );
+    }
+
 }

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/ScanResultSet.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/ScanResultSet.java?rev=1494115&r1=1494114&r2=1494115&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/ScanResultSet.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/ScanResultSet.java Tue Jun 18 12:29:58 2013
@@ -19,6 +19,8 @@
 
 package org.apache.derby.impl.sql.execute;
 
+import org.w3c.dom.Element;
+
 import org.apache.derby.iapi.error.StandardException;
 import org.apache.derby.iapi.services.io.FormatableBitSet;
 import org.apache.derby.iapi.services.sanity.SanityManager;
@@ -88,6 +90,9 @@ abstract class ScanResultSet extends NoP
      */
     protected final FormatableBitSet accessedCols;
 
+	public String tableName;
+	public String indexName;
+
     /**
      * Construct a <code>ScanResultSet</code>.
      *
@@ -245,4 +250,13 @@ abstract class ScanResultSet extends NoP
         candidate.resetRowArray();
         super.close();
     }
+    
+    public Element toXML( Element parentNode, String tag ) throws Exception
+    {
+        Element myNode = super.toXML( parentNode, tag );
+        if ( tableName != null ) { myNode.setAttribute( "tableName", tableName ); }
+        if ( indexName != null ) { myNode.setAttribute( "indexName", indexName ); }
+        
+        return myNode;
+    }
 }

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/TableScanResultSet.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/TableScanResultSet.java?rev=1494115&r1=1494114&r2=1494115&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/TableScanResultSet.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/TableScanResultSet.java Tue Jun 18 12:29:58 2013
@@ -72,9 +72,7 @@ class TableScanResultSet extends ScanRes
 	protected GeneratedMethod stopKeyGetter;
 	protected int stopSearchOperator;
 	public    Qualifier[][] qualifiers;
-	public String tableName;
 	public String userSuppliedOptimizerOverrides;
-	public String indexName;
 	protected boolean runTimeStatisticsOn;
     protected int[] indexCols;		//index keys base column position array
 	public int rowsPerRead;

Modified: db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/TemporaryRowHolderResultSet.java
URL: http://svn.apache.org/viewvc/db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/TemporaryRowHolderResultSet.java?rev=1494115&r1=1494114&r2=1494115&view=diff
==============================================================================
--- db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/TemporaryRowHolderResultSet.java (original)
+++ db/derby/code/trunk/java/engine/org/apache/derby/impl/sql/execute/TemporaryRowHolderResultSet.java Tue Jun 18 12:29:58 2013
@@ -23,6 +23,7 @@ package org.apache.derby.impl.sql.execut
 
 import java.sql.SQLWarning;
 import java.sql.Timestamp;
+import org.w3c.dom.Element;
 
 import org.apache.derby.iapi.error.StandardException;
 import org.apache.derby.iapi.services.io.FormatableBitSet;
@@ -1349,4 +1350,10 @@ class TemporaryRowHolderResultSet implem
 	public final Activation getActivation() {
 		return holder.activation;
 	}
+    
+    public Element toXML( Element parentNode, String tag ) throws Exception
+    {
+        return BasicNoPutResultSetImpl.childrenToXML( BasicNoPutResultSetImpl.toXML( parentNode, tag, this ), this );
+    }
+
 }