I have a similar function.  Would there be any interest in adding something
like this to Cayenne?

John

On Mon, Nov 14, 2011 at 6:01 AM, Andrus Adamchik <and...@objectstyle.org>wrote:

> You can get DataDomain directly from ServerRuntime:
>
>  DataDomain domain = runtime.getDataDomain();
>
> even better - you can get direct access to DataSource:
>
>  DataSource ds = runtime.getDataSource("mynodename");
>
> So in 3.1 with DI various stack objects are a bit closer to your
> application.
>
> Andrus
>
> On Nov 14, 2011, at 2:55 PM, Marco Gattei wrote:
>
> > Hi everyone....
> >
> >    i'm tryng to write a translator from implementing select count(*)
> from a Select Query with an Expression built at runtime via
> ExpressionFactory.
> >
> > In cayenne 2.0 i was using something like:
> >
> > static class CountTranslator extends SelectTranslator {
> >
> >        @Override
> >
> >        public String createSqlString() throws Exception {
> >
> >            String sql = super.createSqlString();
> >
> >            int index = sql.indexOf(" FROM ");
> >
> >            return "SELECT COUNT(*)" + sql.substring(index);
> >
> >        }
> >
> >    }
> >
> >    public int count(SelectQuery query,
> >
> >            DataNode node) {
> >
> >        CountTranslator translator = new CountTranslator();
> >
> >        translator.setQuery(query);
> >
> >        translator.setAdapter(node.getAdapter());
> >
> >
>  
> translator.setEntityResolver(DataContext.getThreadDataContext().getEntityResolver());
> >
> >
> >
> >
> >        Connection con = null;
> >
> >        PreparedStatement stmt = null;
> >
> >        try {
> >
> >            con = node.getDataSource().getConnection();
> >
> >            translator.setConnection(con);
> >
> >            stmt = translator.createStatement();
> >
> >            ResultSet rs = stmt.executeQuery();
> >
> >            if (rs.next()) {
> >
> >                return rs.getInt(1);
> >
> >            }
> >
> >            throw new org.apache.cayenne.CayenneRuntimeException("Count
> query returned no result");
> >
> >        } catch (Exception e) {
> >
> >            throw new CayenneRuntimeException("Cannot count", e);
> >
> >        } finally {
> >
> >            try {
> >
> >                if (stmt != null) {
> >
> >                    stmt.close();
> >
> >                }
> >
> >                if (con != null) {
> >
> >                    con.close();
> >
> >                }
> >
> >            } catch (Exception ex) {
> >
> >                throw new CayenneRuntimeException("Cannot close
> connection", ex);
> >
> >            }
> >
> >        }
> >
> >    }
> >
> >
> >
> > the only thing i nedeed was to get the current connection from the
> context which i did using something like
> >
> >
>  
> DataContext.getThreadDataContext().getParentDataDomain().getDataNodes().iterator().next()
> >
> >
> > but now in Cayenne 3.1 this method seems to be invalid 'cause i cannot
> get ParentDataDomain from ObjectContext.
> > Besides that this works only if have a datanode set for the domain.
> > Is there any other or better way to proceed?
> >
> > Thanks, Marco
> >
> >
> >
> >
>
>

Reply via email to