Transactor tx = (Transactor) Thread.currentThread ();
    public Vector getPropertyNames (Node home, Relation rel) throws Exception {	Transactor tx = (Transactor) Thread.currentThread ();	// tx.timer.beginEvent ("getNodeIDs "+home);	if (rel == null || rel.otherType == null || !rel.otherType.isRelational ()) {	    // this should never be called for embedded nodes	    throw new RuntimeException ("NodeMgr.getPropertyNames called for non-relational node "+home);	} else {	    Vector retval = new Vector ();	    // if we do a groupby query (creating an intermediate layer of groupby nodes),	    // retrieve the value of that field instead of the primary key	    String namefield = rel.accessor;	    Connection con = rel.otherType.getConnection ();	    String table = rel.otherType.getTableName ();	    QueryDataSet qds = null;	    try {	        String q = "SELECT "+namefield+" FROM "+table+" ORDER BY "+namefield;	        qds = new QueryDataSet (con, q);	        if (logSql)	           app.logEvent ("### getPropertyNames: "+qds.getSelectString());	        qds.fetchRecords ();	        for (int i=0; i<qds.size (); i++) {	            Record rec = qds.getRecord (i);	            String n = rec.getValue (1).asString ();	            if (n != null)	                retval.addElement (n);	        }	    } finally {	        // tx.timer.endEvent ("getNodeIDs "+home);	        if (qds != null) try {	            qds.close ();	        } catch (Exception ignore) {}	    }	    return retval;	}    }