protected Value createVariable(String id, boolean bind) { // create and cache var Class<?> type = getDeclaredVariableType(id); // add this type to the set of classes in the filter's access path ClassMetaData meta = null; if (type == null) type = TYPE_OBJECT; else meta = getMetaData(type, false); if (meta != null) { addAccessPath(meta); addSchemaToContext(id, meta); } Value var = null; if (bind) var = factory.newBoundVariable(id, type); else var = factory.newUnboundVariable(id, type); var.setMetaData(meta); if (_seenVars == null) _seenVars = new HashMap<String,Value>(); _seenVars.put(id, var); addVariableToContext(id, var); return var; }
/** * Convenience method to get metadata for the given type. */ protected ClassMetaData getMetaData(Class<?> c, boolean required) { return getMetaData(c, required, getClassLoader()); }
/** * Returns a value for the given id. */ protected Value getVariable(String id, boolean bind) { // check for already constructed var if (isSeenVariable(id)) return getVariable(id); return createVariable(id, bind); }
/** * Validate that all unbound variables are of a PC type. If not, assume * that the user actually made a typo that we took for an implicit * unbound variable. */ protected void assertUnboundVariablesValid() { if (_seenVars == null) return; Value var; for (Map.Entry<String,Value> entry : _seenVars.entrySet()) { var = entry.getValue(); if (var.getMetaData() == null && !isBound(var) && !isDeclaredVariable(entry.getKey())) { throw parseException(EX_USER, "not-unbound-var", new Object[]{ entry.getKey() }, null); } } }
ClassMetaData meta = path.getMetaData(); if (meta == null) throw parseException(EX_USER, "path-no-meta", new Object[]{ field, path.getType() }, null); Object val = traverseStaticField(meta.getDescribedType(), field); if (val == null) { if (isMultiValuedTraversalAttempt(path, field)) { throw parseException(EX_USER, "multi-valued-travesal", new Object[]{field, path.last()}, null); throw parseException(EX_USER, "no-field", new Object[] {field, cls.getSimpleName(), StringDistance.getClosestLevenshteinDistance(field, all), meta = fmd.getDeclaredTypeMetaData(); if (meta != null) { addAccessPath(meta); path.setMetaData(meta);
protected static void setImplicitTypes(Value val1, Value val2, Class<?> expected, Resolver resolver) { Class<?> c1 = val1.getType(); Class<?> c2 = val2.getType(); boolean o1 = c1 == TYPE_OBJECT; boolean o2 = c2 == TYPE_OBJECT; if (o1 && !o2) { val1.setImplicitType(c2); if (val1.getMetaData() == null && !val1.isXPath()) val1.setMetaData(val2.getMetaData()); } else if (!o1 && o2) { val2.setImplicitType(c1); if (val2.getMetaData() == null && !val1.isXPath()) val2.setMetaData(val1.getMetaData()); } else if (o1 && o2 && expected != null) { // we never expect a pc type, so don't bother with metadata val1.setImplicitType(expected); val2.setImplicitType(expected); } else if (isNumeric(val1.getType()) != isNumeric(val2.getType())) { if (resolver.getConfiguration().getCompatibilityInstance(). getQuotedNumbersInQueries()) convertTypesQuotedNumbers(val1, val2); else convertTypes(val1, val2); } // convertLiteralToAvoidCast(val1, val2); }
/** * Create a proper parse exception for the given reason. */ protected OpenJPAException parseException(int e, String token, Object[] args, Exception nest) { String argStr; if (args == null) argStr = getLocalizer().get(token).getMessage(); else argStr = getLocalizer().get(token, args).getMessage(); Message msg = _loc.get("parse-error", argStr, currentQuery()); switch (e) { case EX_FATAL: throw new InternalException(msg, nest); case EX_UNSUPPORTED: throw new UnsupportedException(msg, nest); default: throw new UserException(msg, nest); } }
/** * Returns a value for the given id. */ protected Value getVariable(String id, boolean bind) { // check for already constructed var if (isSeenVariable(id)) return (Value) _seenVars.get(id); // create and cache var Class type = getDeclaredVariableType(id); // add this type to the set of classes in the filter's access path ClassMetaData meta = null; if (type == null) type = TYPE_OBJECT; else meta = getMetaData(type, false); if (meta != null) _accessPath.add(meta); Value var; if (bind) var = factory.newBoundVariable(id, type); else var = factory.newUnboundVariable(id, type); var.setMetaData(meta); if (_seenVars == null) _seenVars = new HashMap(); _seenVars.put(id, var); return var; }
ClassMetaData meta = path.getMetaData(); if (meta == null) throw parseException(EX_USER, "path-no-meta", new Object[]{ field, path.getType() }, null); Object val = traverseStaticField(meta.getDescribedType(), field); if (val == null) throw parseException(EX_USER, "no-field", new Object[]{ meta.getDescribedType(), field }, null); meta = fmd.getDeclaredTypeMetaData(); if (meta != null) { addAccessPath(meta); path.setMetaData(meta);
/** * Identification variables in JPQL are case insensitive, so lower-case * all variables we are going to bind. */ protected Value getVariable(String id, boolean bind) { if (id == null) return null; return super.getVariable(id.toLowerCase(), bind); }
if (meta != null) { val2.setMetaData(meta); addAccessPath(meta); if (meta != null) { val2.setMetaData(meta); addAccessPath(meta);
ClassMetaData meta = path.getMetaData(); if (meta == null) throw parseException(EX_USER, "path-no-meta", new Object[]{ field, path.getType() }, null); Object val = traverseStaticField(meta.getDescribedType(), field); if (val == null) { if (isMultiValuedTraversalAttempt(path, field)) { throw parseException(EX_USER, "multi-valued-travesal", new Object[]{field, path.last()}, null); throw parseException(EX_USER, "no-field", new Object[] {field, cls.getSimpleName(), StringDistance.getClosestLevenshteinDistance(field, all), meta = fmd.getDeclaredTypeMetaData(); if (meta != null) { addAccessPath(meta); path.setMetaData(meta);
/** * Validate that all unbound variables are of a PC type. If not, assume * that the user actually made a typo that we took for an implicit * unbound variable. */ protected void assertUnboundVariablesValid() { if (_seenVars == null) return; Value var; for (Map.Entry<String,Value> entry : _seenVars.entrySet()) { var = entry.getValue(); if (var.getMetaData() == null && !isBound(var) && !isDeclaredVariable(entry.getKey())) { throw parseException(EX_USER, "not-unbound-var", new Object[]{ entry.getKey() }, null); } } }
protected static void setImplicitTypes(Value val1, Value val2, Class<?> expected, Resolver resolver) { Class<?> c1 = val1.getType(); Class<?> c2 = val2.getType(); boolean o1 = c1 == TYPE_OBJECT; boolean o2 = c2 == TYPE_OBJECT; if (o1 && !o2) { val1.setImplicitType(c2); if (val1.getMetaData() == null && !val1.isXPath()) val1.setMetaData(val2.getMetaData()); } else if (!o1 && o2) { val2.setImplicitType(c1); if (val2.getMetaData() == null && !val1.isXPath()) val2.setMetaData(val1.getMetaData()); } else if (o1 && o2 && expected != null) { // we never expect a pc type, so don't bother with metadata val1.setImplicitType(expected); val2.setImplicitType(expected); } else if (isNumeric(val1.getType()) != isNumeric(val2.getType())) { if (resolver.getConfiguration().getCompatibilityInstance(). getQuotedNumbersInQueries()) convertTypesQuotedNumbers(val1, val2); else convertTypes(val1, val2); } // convertLiteralToAvoidCast(val1, val2); }
/** * Create a proper parse exception for the given reason. */ protected OpenJPAException parseException(int e, String token, Object[] args, Exception nest) { String argStr; if (args == null) argStr = getLocalizer().get(token).getMessage(); else argStr = getLocalizer().get(token, args).getMessage(); Message msg = _loc.get("parse-error", argStr, currentQuery()); switch (e) { case EX_FATAL: throw new InternalException(msg, nest); case EX_UNSUPPORTED: throw new UnsupportedException(msg, nest); default: throw new UserException(msg, nest); } }
/** * Identification variables in JPQL are case insensitive, so lower-case * all variables we are going to bind. */ protected Value getVariable(String id, boolean bind) { if (id == null) return null; if (bind && getDefinedVariable(id) == null) return createVariable(id, bind); return super.getVariable(id.toLowerCase(), bind); }
if (meta != null) { val2.setMetaData(meta); addAccessPath(meta); if (meta != null) { val2.setMetaData(meta); addAccessPath(meta);
protected Value createVariable(String id, boolean bind) { // create and cache var Class<?> type = getDeclaredVariableType(id); // add this type to the set of classes in the filter's access path ClassMetaData meta = null; if (type == null) type = TYPE_OBJECT; else meta = getMetaData(type, false); if (meta != null) { addAccessPath(meta); addSchemaToContext(id, meta); } Value var = null; if (bind) var = factory.newBoundVariable(id, type); else var = factory.newUnboundVariable(id, type); var.setMetaData(meta); if (_seenVars == null) _seenVars = new HashMap<String,Value>(); _seenVars.put(id, var); addVariableToContext(id, var); return var; }
ClassMetaData meta = path.getMetaData(); if (meta == null) throw parseException(EX_USER, "path-no-meta", new Object[]{ field, path.getType() }, null); Object val = traverseStaticField(meta.getDescribedType(), field); if (val == null) { if (isMultiValuedTraversalAttempt(path, field)) { throw parseException(EX_USER, "multi-valued-travesal", new Object[]{field, path.last()}, null); throw parseException(EX_USER, "no-field", new Object[] {field, cls.getSimpleName(), StringDistance.getClosestLevenshteinDistance(field, all), meta = fmd.getDeclaredTypeMetaData(); if (meta != null) { addAccessPath(meta); path.setMetaData(meta);
/** * Validate that all unbound variables are of a PC type. If not, assume * that the user actually made a typo that we took for an implicit * unbound variable. */ protected void assertUnboundVariablesValid() { if (_seenVars == null) return; Value var; for (Map.Entry<String,Value> entry : _seenVars.entrySet()) { var = entry.getValue(); if (var.getMetaData() == null && !isBound(var) && !isDeclaredVariable(entry.getKey())) { throw parseException(EX_USER, "not-unbound-var", new Object[]{ entry.getKey() }, null); } } }