/** key used to extract array index if needed */ protected String getSelectColName(Column col, String key) { String colName = getSelectColName(col); if (col.isArray()) { String[] segments = canonicalXPath(key).split("/"); if (segments.length > 1) { // last segment String segment = segments[segments.length - 1]; if (INDEX.matcher(segment).matches() && !segment.startsWith("*")) { int arrayElementIndex = Integer.parseInt(segment); colName = dialect.getArrayElementString(colName, arrayElementIndex); } } } return colName; }
protected void visitReference(Column column, String cast, int arrayElementIndex) { if (DATE_CAST.equals(cast) && column.getType() != ColumnType.TIMESTAMP) { throw new QueryParseException("Cannot cast to " + cast + ": " + column); } String qname = column.getFullQuotedName(); if (arrayElementIndex != -1) { if (column.isArray()) { qname = dialect.getArrayElementString(qname, arrayElementIndex); } else { throw new QueryParseException( "Cannot use array index " + arrayElementIndex + " for non-array column " + column); } } // some databases (Derby) can't do comparisons on CLOB if (column.getJdbcType() == Types.CLOB) { String colFmt = dialect.getClobCast(inOrderBy); if (colFmt != null) { qname = String.format(colFmt, qname, Integer.valueOf(255)); } } if (cast != null) { // only DATE cast for now String fmt = dialect.getDateCast(); buf.append(String.format(fmt, qname)); } else { buf.append(qname); } }