StringBuffer left = new StringBuffer(); if (subQCEval != null) { queryEvaluableToString(left, subQCEval, q, state); } else { queryClassToString(left, subQCClass, q, schema, QUERY_SUBQUERY_CONSTRAINT, state); existing.append(" UNION "); existing.append(generate(subQCQuery, schema, state.getDb(), null, QUERY_SUBQUERY_CONSTRAINT, state.getBagTableNames())); } else { if ((disjunctive && completelyFalse(subC)) || ((!disjunctive) && completelyTrue(subC))) { constraintToString(state, buffer, subC, q, schema, newSafeness, (!negate) && (!disjunctive));
constraintSetToString(state, buffer, (ConstraintSet) c, q, schema, safeness, loseBrackets); } else if (c instanceof SimpleConstraint) { simpleConstraintToString(state, buffer, (SimpleConstraint) c, q); } else if (c instanceof SubqueryConstraint) { subqueryConstraintToString(state, buffer, (SubqueryConstraint) c, q, schema); } else if (c instanceof SubqueryExistsConstraint) { subqueryExistsConstraintToString(state, buffer, (SubqueryExistsConstraint) c, schema); } else if (c instanceof ClassConstraint) { classConstraintToString(state, buffer, (ClassConstraint) c, q, schema); } else if (c instanceof ContainsConstraint) { containsConstraintToString(state, buffer, (ContainsConstraint) c, q, schema, safeness, loseBrackets); } else if (c instanceof BagConstraint) { bagConstraintToString(state, buffer, (BagConstraint) c, q, schema, safeness); } else if (c instanceof MultipleInBagConstraint) { multipleInBagConstraintToString(state, buffer, (MultipleInBagConstraint) c, q, safeness); } else if (c instanceof OverlapConstraint) { overlapConstraintToString(state, buffer, (OverlapConstraint) c, q, schema, safeness); } else { throw (new ObjectStoreException("Unknown constraint type: " + c));
/** * Builds a Set of all table names that are touched by a given query. * * @param q the Query * @param schema the DatabaseSchema in which to look up metadata * @return a Set of table names * @throws ObjectStoreException if something goes wrong */ public static Set<String> findTableNames(Query q, DatabaseSchema schema) throws ObjectStoreException { Set<Object> retvalO = findTableNames(q, schema, false); // If the last argument is false, we know that the result only contains Strings. Set<String> retval = (Set) retvalO; return retval; }
/** * Builds a Set of all table names that are touched by a given query. * * @param q the Query * @param schema the DatabaseSchema in which to look up metadata * @param individualOsbs if true, adds individual ObjectStoreBags to the Set, otherwise just * adds the table name instead * @return a Set of table names * @throws ObjectStoreException if something goes wrong */ public static Set<Object> findTableNames(Query q, DatabaseSchema schema, boolean individualOsbs) throws ObjectStoreException { Map<Query, Set<Object>> schemaCache = getTablenamesCacheForSchema(schema); synchronized (q) { Set<Object> tablenames = schemaCache.get(q); if (tablenames == null) { tablenames = new HashSet<Object>(); findTableNames(tablenames, q, schema, true, individualOsbs); schemaCache.put(q, tablenames); } return tablenames; } }
/** * Builds a String representing the GROUP BY component of the Sql query. * * @param q the Query * @param schema the DatabaseSchema in which to look up metadata * @param state a State object * @return a String * @throws ObjectStoreException if something goes wrong */ protected static String buildGroupBy(Query q, DatabaseSchema schema, State state) throws ObjectStoreException { StringBuffer retval = new StringBuffer(); boolean needComma = false; for (QueryNode node : q.getGroupBy()) { retval.append(needComma ? ", " : " GROUP BY "); needComma = true; if (node instanceof QueryClass) { queryClassToString(retval, (QueryClass) node, q, schema, NO_ALIASES_ALL_FIELDS, state); } else { queryEvaluableToString(retval, (QueryEvaluable) node, q, state); } } return retval.toString(); }
/** * Create temporary tables for the bag in the BagConstraints of the given Query, then call * SqlGenerator.generate(). * * @param c a Connection to use * @param q the Query * @param start the start row number (inclusive, from zero) * @param limit maximum number of rows to return * @return the SQL for the Query * @throws ObjectStoreException if an error occurs */ protected String generateSql(Connection c, Query q, int start, int limit) throws ObjectStoreException { createTempBagTablesForQuery(c, q); return SqlGenerator.generate(q, start, limit, schema, db, bagConstraintTables); }
q.addFrom(c1); q.addToSelect(c1); assertEquals("SQL incorrect.", getRegisterOffset1(), SqlGenerator.generate(q, 0, Integer.MAX_VALUE, schema, db, new HashMap())); SqlGenerator.registerOffset(q, 5, schema, db, new Integer(10), new HashMap()); assertEquals(getRegisterOffset1(), SqlGenerator.generate(q, 0, Integer.MAX_VALUE, schema, db, new HashMap())); assertEquals(getRegisterOffset2() + "a1_.id > 10 ORDER BY a1_.id OFFSET 5", SqlGenerator.generate(q, 10, Integer.MAX_VALUE, schema, db, new HashMap())); SqlGenerator.registerOffset(q, 11000, schema, db, new Integer(20), new HashMap()); assertEquals(getRegisterOffset1(), SqlGenerator.generate(q, 0, Integer.MAX_VALUE, schema, db, new HashMap())); assertEquals(getRegisterOffset2() + "a1_.id > 10 ORDER BY a1_.id OFFSET 5", SqlGenerator.generate(q, 10, Integer.MAX_VALUE, schema, db, new HashMap())); assertEquals(getRegisterOffset2() + "a1_.id > 20 ORDER BY a1_.id OFFSET 5", SqlGenerator.generate(q, 11005, Integer.MAX_VALUE, schema, db, new HashMap())); SqlGenerator.registerOffset(q, 21000, schema, db, new Integer(30), new HashMap()); assertEquals(getRegisterOffset1(), SqlGenerator.generate(q, 0, Integer.MAX_VALUE, schema, db, new HashMap())); assertEquals(getRegisterOffset2() + "a1_.id > 10 ORDER BY a1_.id OFFSET 5", SqlGenerator.generate(q, 10, Integer.MAX_VALUE, schema, db, new HashMap())); assertEquals(getRegisterOffset2() + "a1_.id > 10 ORDER BY a1_.id OFFSET 11000", SqlGenerator.generate(q, 11005, Integer.MAX_VALUE, schema, db, new HashMap())); assertEquals(getRegisterOffset2() + "a1_.id > 30 ORDER BY a1_.id OFFSET 5", SqlGenerator.generate(q, 21005, Integer.MAX_VALUE, schema, db, new HashMap())); SqlGenerator.registerOffset(q, 21005, schema, db, new Integer(31), new HashMap()); assertEquals(getRegisterOffset1(), SqlGenerator.generate(q, 0, Integer.MAX_VALUE, schema, db, new HashMap())); assertEquals(getRegisterOffset2() + "a1_.id > 10 ORDER BY a1_.id OFFSET 5", SqlGenerator.generate(q, 10, Integer.MAX_VALUE, schema, db, new HashMap())); assertEquals(getRegisterOffset2() + "a1_.id > 10 ORDER BY a1_.id OFFSET 11000", SqlGenerator.generate(q, 11005, Integer.MAX_VALUE, schema, db, new HashMap())); assertEquals(getRegisterOffset2() + "a1_.id > 30 ORDER BY a1_.id OFFSET 5", SqlGenerator.generate(q, 21005, Integer.MAX_VALUE, schema, db, new HashMap())); SqlGenerator.registerOffset(q, 11002, schema, db, new Integer(29), new HashMap()); assertEquals(getRegisterOffset1(), SqlGenerator.generate(q, 0, Integer.MAX_VALUE, schema, db, new HashMap())); assertEquals(getRegisterOffset2() + "a1_.id > 10 ORDER BY a1_.id OFFSET 5", SqlGenerator.generate(q, 10, Integer.MAX_VALUE, schema, db, new HashMap())); assertEquals(getRegisterOffset2() + "a1_.id > 10 ORDER BY a1_.id OFFSET 11000", SqlGenerator.generate(q, 11005, Integer.MAX_VALUE, schema, db, new HashMap())); assertEquals(getRegisterOffset2() + "a1_.id > 30 ORDER BY a1_.id OFFSET 5", SqlGenerator.generate(q, 21005, Integer.MAX_VALUE, schema, db, new HashMap())); SqlGenerator.registerOffset(q, 101000, schema, db, new Integer(40), new HashMap()); assertEquals(getRegisterOffset1(), SqlGenerator.generate(q, 0, Integer.MAX_VALUE, schema, db, new HashMap())); assertEquals(getRegisterOffset2() + "a1_.id > 10 ORDER BY a1_.id OFFSET 5", SqlGenerator.generate(q, 10, Integer.MAX_VALUE, schema, db, new HashMap())); assertEquals(getRegisterOffset2() + "a1_.id > 10 ORDER BY a1_.id OFFSET 11000", SqlGenerator.generate(q, 11005, Integer.MAX_VALUE, schema, db, new HashMap()));
SqlGenerator.generate(q, 0, Integer.MAX_VALUE, getSchema(), db, new HashMap()); fail(type + " was expected to fail"); } catch (Exception e) { String generated = SqlGenerator.generate(q, 0, Integer.MAX_VALUE, getSchema(), db, bagTableNames); if (expected instanceof String) { assertEquals(results2.get(type), SqlGenerator.findTableNames(q, getSchema(), false));
DatabaseSchema schema) throws ObjectStoreException { if (c != null) { if (completelyFalse(c)) { throw new CompletelyFalseException(); if (completelyTrue(c)) { return; constraints.addAll(0, ((ConstraintSet) con).getConstraints()); } else { boolean[] whs = whereHavingSafe(con, q); if (whs[1] && usingHaving) { StringBuffer buffer = state.getHavingBuffer(); constraintToString(state, buffer, con, q, schema, SAFENESS_SAFE, true); } else if (whs[0]) { StringBuffer buffer = state.getWhereBuffer(); constraintToString(state, buffer, con, q, schema, SAFENESS_SAFE, true); } else { throw new ObjectStoreException("Constraint " + con + " mixes WHERE"
/** * Converts a SubqueryConstraint object into a String suitable for putting in an SQL query. * * @param state the current SqlGenerator state * @param buffer the StringBuffer to place text into * @param c the SubqueryConstraint object * @param q the Query * @param schema the DatabaseSchema in which to look up metadata * @throws ObjectStoreException if something goes wrong */ protected static void subqueryConstraintToString(State state, StringBuffer buffer, SubqueryConstraint c, Query q, DatabaseSchema schema) throws ObjectStoreException { Query subQ = c.getQuery(); QueryEvaluable qe = c.getQueryEvaluable(); QueryClass cls = c.getQueryClass(); if (qe != null) { queryEvaluableToString(buffer, qe, q, state); } else { queryClassToString(buffer, cls, q, schema, QUERY_SUBQUERY_CONSTRAINT, state); } buffer.append(" " + c.getOp().toString() + " (" + generate(subQ, schema, state.getDb(), null, QUERY_SUBQUERY_CONSTRAINT, state.getBagTableNames()) + ")"); }
Map<Query, CacheEntry> schemaCache = getCacheForSchema(schema); CacheEntry cacheEntry = schemaCache.get(q); if (cacheEntry != null) { Constraint c = getOffsetConstraint(q, firstOrderBy, value, schema); String sql = generate(q, schema, db, c, QUERY_NORMAL, bagTableNames); cacheEntry.setLast(start, sql); Constraint offsetConstraint = getOffsetConstraint(q, firstOrderByO, value, schema); String sql = generate(q, schema, db, offsetConstraint, QUERY_NORMAL, bagTableNames); if (cacheEntry == null) { cacheEntry = new CacheEntry(start, sql);
public void testInvalidSafenesses() throws Exception { try { SqlGenerator.constraintToString(null, null, null, null, null, 3, false); fail("Expected: ObjectStoreException"); } catch (ObjectStoreException e) { assertEquals("Unknown ContainsConstraint safeness: 3", e.getMessage()); } try { SqlGenerator.constraintSetToString(null, null, null, null, null, 3, false); fail("Expected: ObjectStoreException"); } catch (ObjectStoreException e) { assertEquals("Unknown ContainsConstraint safeness: 3", e.getMessage()); } try { SqlGenerator.containsConstraintToString(null, null, null, null, null, 3, false); fail("Expected: ObjectStoreException"); } catch (ObjectStoreException e) { assertEquals("Unknown ContainsConstraint safeness: 3", e.getMessage()); } }
DatabaseSchema schema, boolean addInterMineObject, boolean individualOsbs) throws ObjectStoreException { if (completelyFalse(q.getConstraint())) { return; findTableNamesInConstraint(tablenames, q.getConstraint(), schema, individualOsbs); for (FromElement fromElement : q.getFrom()) { if (fromElement instanceof QueryClass) { findTableNames(tablenames, subQ, schema, false, individualOsbs); } else if (fromElement instanceof QueryClassBag) { Collection<ProxyReference> empty = Collections.singleton(new ProxyReference(null, new Integer(1), InterMineObject.class)); findTableNames(tablenames, ((QueryCollectionPathExpression) selectable) .getQuery(empty), schema, addInterMineObject, individualOsbs); } else if (selectable instanceof QueryObjectPathExpression) { Collection<Integer> empty = Collections.singleton(new Integer(1)); findTableNames(tablenames, ((QueryObjectPathExpression) selectable) .getQuery(empty, schema.isMissingNotXml()), schema, addInterMineObject, individualOsbs); } else if (selectable instanceof PathExpressionField) { Collection<Integer> empty = Collections.singleton(new Integer(1)); findTableNames(tablenames, ((PathExpressionField) selectable).getQope() .getQuery(empty, schema.isMissingNotXml()), schema, addInterMineObject, individualOsbs);
while (csIter.hasNext() && retval) { Constraint c = csIter.next(); retval = retval && completelyTrue(c); while (csIter.hasNext() && (!retval)) { Constraint c = csIter.next(); retval = retval || completelyTrue(c); while (csIter.hasNext() && retval) { Constraint c = csIter.next(); retval = retval && completelyFalse(c); while (csIter.hasNext() && retval) { Constraint c = csIter.next(); retval = retval || completelyFalse(c);
for (QueryEvaluable qe : c.getEvaluables()) { StringBuffer lhsBuffer = new StringBuffer(); queryEvaluableToString(lhsBuffer, qe, q, state); leftHandSide.add(lhsBuffer.toString()); objectToString(buffer, orNext);
+ CLOBPAGE_COLUMN; Map<Query, CacheEntry> schemaCache = getCacheForSchema(schema); CacheEntry cacheEntry = schemaCache.get(q); if (cacheEntry != null) { String sql = generate(q, schema, db, null, QUERY_NORMAL, bagTableNames);
if (c.getQueryNode() instanceof QueryEvaluable) { StringBuffer lhsBuffer = new StringBuffer(); queryEvaluableToString(lhsBuffer, (QueryEvaluable) c.getQueryNode(), q, state); leftHandSide = lhsBuffer.toString(); } else { StringBuffer lhsBuffer = new StringBuffer(); queryClassToString(lhsBuffer, (QueryClass) c.getQueryNode(), q, schema, ID_ONLY, state); leftHandSide = lhsBuffer.toString(); objectToString(buffer, orNext);
/** * Converts a SimpleConstraint object into a String suitable for putting in an SQL query. * * @param state the current SqlGenerator state * @param buffer the StringBuffer to place text into * @param c the SimpleConstraint object * @param q the Query * @throws ObjectStoreException if something goes wrong */ protected static void simpleConstraintToString(State state, StringBuffer buffer, SimpleConstraint c, Query q) throws ObjectStoreException { queryEvaluableToString(buffer, c.getArg1(), q, state); buffer.append(" " + c.getOp().toString()); if (c.getArg2() != null) { buffer.append(" "); queryEvaluableToString(buffer, c.getArg2(), q, state); } }
public void testInvalidClassForGetById() throws Exception { try { SqlGenerator.generateQueryForId(new Integer(5), SqlGeneratorTest.class, getSchema()); fail("Expected: ObjectStoreException"); } catch (ObjectStoreException e) { assertEquals("class org.intermine.objectstore.intermine.SqlGeneratorTest is not in the model", e.getMessage()); } try { SqlGenerator.tableNameForId(SqlGeneratorTest.class, getSchema()); fail("Expected: ObjectStoreException"); } catch (ObjectStoreException e) { assertEquals("class org.intermine.objectstore.intermine.SqlGeneratorTest is not in the model", e.getMessage()); } } }
if (c instanceof ConstraintSet) { for (Constraint subC : ((ConstraintSet) c).getConstraints()) { findTableNamesInConstraint(tablenames, subC, schema, individualOsbs); findTableNames(tablenames, ((SubqueryConstraint) c).getQuery(), schema, false, individualOsbs); } else if (c instanceof SubqueryExistsConstraint) { findTableNames(tablenames, ((SubqueryExistsConstraint) c).getQuery(), schema, false, individualOsbs); } else if (c instanceof ContainsConstraint) {