Jacob Rhoden created CASSANDRA-6371:
---------------------------------------

             Summary: cassandra-driver-core-2.0.0-rc1.jar fails in this case
                 Key: CASSANDRA-6371
                 URL: https://issues.apache.org/jira/browse/CASSANDRA-6371
             Project: Cassandra
          Issue Type: Bug
          Components: Drivers (now out of tree)
            Reporter: Jacob Rhoden


Testing this out switching over to the new driver. Its mostly working except 
for one particular query (or code?) is causing the following:

com.datastax.driver.core.exceptions.DriverInternalError: Tried to execute 
unknown prepared query 0x67dfcaa71c14d42a0a7f62406b41ea3e
   com.datastax.driver.core.exceptions.DriverInternalError.copy():42
   
com.datastax.driver.core.ResultSetFuture.extractCauseFromExecutionException():271
   com.datastax.driver.core.ResultSetFuture.getUninterruptibly():187
   com.datastax.driver.core.Session.execute():126
   tap.command.GetNewsFeed.execute():72
   tap.servlet.HomeServlet.doGet():38
   javax.servlet.http.HttpServlet.service():668

Anyone encounter this one before? Any suggestions? In case its relevant, line 
72 is the for loop statement:

                PreparedStatement p = s.prepare(
                                "select uuid,to_uuid,to_first_name, 
to_last_name,from_uuid,from_first_name,from_last_name,action,message "+
                                "from news_feed " +
                                "where person_uuid = ? " +
                                "order by uuid desc " +
                                "limit 50");
                PreparedStatement q = s.prepare("select count(*) from 
post_likes where post_uuid=?");
                PreparedStatement c = s.prepare("select comments from 
post_counters where uuid=?");
                PreparedStatement lq = s.prepare("select person_uuid from 
post_likes where post_uuid=? and person_uuid=?");

                for(Row r : s.execute(p.bind(user.getPersonUuid()))) {
                        Message m = new Message();
                        Person to = new Person();
                        to.setUuid(r.getUUID(1));
                        to.setFirstName(r.getString(2));
                        to.setLastName(r.getString(3));
                        Person from = new Person();
                        from.setUuid(r.getUUID(4));
                        from.setFirstName(r.getString(5));
                        from.setLastName(r.getString(6));
                        m.setUuid(r.getUUID(0));
                        m.setTo(to);
                        m.setFrom(from);
                        m.setAction(r.getString(7));
                        m.setMessage(r.getString(8));
                        results.add(m);
                        
m.setLikeCount((int)s.execute(q.bind(m.getUuid())).one().getLong(0));
                        for(Row r2 : s.execute(c.bind(m.getUuid()))) {
                                m.setCommentCount((int)r2.getLong(0));
                        }
                        m.setLiked(s.execute(lq.bind(m.getUuid(), 
user.getPersonUuid())).iterator().hasNext());
                        
m.setFromMe(from.getUuid().equals(user.getPersonUuid()));
                        m.setToMe(to.getUuid().equals(user.getPersonUuid()));
                }

Reworking the code as follows avoids the problem:

        public List<Message> execute() throws IOException {
                List<Message> results = new LinkedList<>();

                Session s = api.getCassandraSession();
                PreparedStatement p = s.prepare(
                                "select uuid,to_uuid,to_first_name, 
to_last_name,from_uuid,from_first_name,from_last_name,action,message "+
                                "from news_feed " +
                                "where person_uuid = ? " +
                                "order by uuid desc " +
                                "limit 50");

                for(Row r : s.execute(p.bind(user.getPersonUuid()))) {
                        Message m = new Message();
                        Person to = new Person();
                        to.setUuid(r.getUUID(1));
                        to.setFirstName(r.getString(2));
                        to.setLastName(r.getString(3));
                        Person from = new Person();
                        from.setUuid(r.getUUID(4));
                        from.setFirstName(r.getString(5));
                        from.setLastName(r.getString(6));
                        m.setUuid(r.getUUID(0));
                        m.setTo(to);
                        m.setFrom(from);
                        m.setAction(r.getString(7));
                        m.setMessage(r.getString(8));
                        results.add(m);
                        
m.setFromMe(from.getUuid().equals(user.getPersonUuid()));
                        m.setToMe(to.getUuid().equals(user.getPersonUuid()));
                }

                PreparedStatement q = s.prepare("select count(*) from 
post_likes where post_uuid=?");
                PreparedStatement c = s.prepare("select comments from 
post_counters where uuid=?");
                PreparedStatement lq = s.prepare("select person_uuid from 
post_likes where post_uuid=? and person_uuid=?");
                for(Message m : results) {
                        
m.setLikeCount((int)s.execute(q.bind(m.getUuid())).one().getLong(0));
                        for(Row r2 : s.execute(c.bind(m.getUuid()))) {
                                m.setCommentCount((int)r2.getLong(0));
                        }
                        m.setLiked(s.execute(lq.bind(m.getUuid(), 
user.getPersonUuid())).iterator().hasNext());
                }

                return results;
        }




--
This message was sent by Atlassian JIRA
(v6.1#6144)

Reply via email to