Revision 47787 trunk/org.gvsig.desktop/org.gvsig.desktop.compat.cdc/org.gvsig.fmap.dal/org.gvsig.fmap.dal.db/org.gvsig.fmap.dal.db.jdbc/src/main/java/org/gvsig/fmap/dal/store/jdbc2/spi/JDBCHelperBase.java
JDBCHelperBase.java | ||
---|---|---|
72 | 72 |
import org.gvsig.fmap.dal.expressionevaluator.FeatureAttributeEmulatorExpression; |
73 | 73 |
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor; |
74 | 74 |
import org.gvsig.fmap.dal.feature.FeatureAttributeEmulator; |
75 |
import org.gvsig.fmap.dal.feature.FeatureQuery; |
|
75 | 76 |
import org.gvsig.fmap.dal.feature.FeatureQueryOrder; |
76 | 77 |
import org.gvsig.fmap.dal.feature.FeatureType; |
77 | 78 |
import org.gvsig.fmap.dal.feature.ForeingKey; |
... | ... | |
759 | 760 |
public void processSpecialFunctions( |
760 | 761 |
SQLBuilder sqlbuilder, |
761 | 762 |
FeatureType type, |
762 |
List<String> extra_column_names) { |
|
763 |
List<String> extra_column_names, |
|
764 |
FeatureQuery query) { |
|
763 | 765 |
replaceForeingValueFunction(sqlbuilder, type, extra_column_names); |
764 | 766 |
replaceExistsFunction(sqlbuilder, type, extra_column_names); |
765 |
addTableToColumnReferences(sqlbuilder, type); |
|
767 |
addTableToColumnReferences(sqlbuilder, type, query);
|
|
766 | 768 |
} |
767 | 769 |
|
768 | 770 |
@SuppressWarnings("Convert2Lambda") |
... | ... | |
1051 | 1053 |
} |
1052 | 1054 |
} |
1053 | 1055 |
|
1054 |
protected void addTableToColumnReferences(SQLBuilder sqlbuilder, FeatureType type) { |
|
1056 |
protected void addTableToColumnReferences(SQLBuilder sqlbuilder, FeatureType type, FeatureQuery query) {
|
|
1055 | 1057 |
SelectBuilder select = sqlbuilder.select(); |
1056 | 1058 |
List<Pair<SQLBuilder.TableNameBuilder, FeatureType>> tables = new ArrayList<>(); |
1057 | 1059 |
collectTablesFromSelect(select, tables, type); |
... | ... | |
1059 | 1061 |
addTableToColumnReferencesInSingleSelect( |
1060 | 1062 |
sqlbuilder, |
1061 | 1063 |
select, |
1062 |
tables |
|
1064 |
tables, |
|
1065 |
query |
|
1063 | 1066 |
); |
1064 | 1067 |
|
1065 | 1068 |
} |
... | ... | |
1087 | 1090 |
} |
1088 | 1091 |
} |
1089 | 1092 |
|
1090 |
protected void addTableToColumnReferencesInSingleSelect(SQLBuilder sqlbuilder, SelectBuilder select, List<Pair<SQLBuilder.TableNameBuilder,FeatureType>> outerTables) { |
|
1093 |
private boolean isComputed(String name, FeatureType featureType, FeatureQuery query ) { |
|
1094 |
FeatureAttributeDescriptor attr = featureType.getAttributeDescriptor(name); |
|
1095 |
if( attr !=null ) { |
|
1096 |
return attr.isComputed(); |
|
1097 |
} |
|
1098 |
if( query == null ) { |
|
1099 |
return false; |
|
1100 |
} |
|
1101 |
attr = query.getExtraColumns().get(name); |
|
1102 |
if( attr !=null ) { |
|
1103 |
return true; //attr.isComputed(); |
|
1104 |
} |
|
1105 |
return false; |
|
1106 |
} |
|
1107 |
|
|
1108 |
protected void addTableToColumnReferencesInSingleSelect(SQLBuilder sqlbuilder, SelectBuilder select, List<Pair<SQLBuilder.TableNameBuilder,FeatureType>> outerTables, FeatureQuery query) { |
|
1091 | 1109 |
|
1110 |
FeatureType mainFeatureType = CollectionUtils.isEmpty(outerTables)?null:outerTables.get(0).getRight(); |
|
1111 |
|
|
1092 | 1112 |
final SQLBuilder.TableNameBuilder fromTable = select.from().table(); |
1093 | 1113 |
|
1094 | 1114 |
final List<ExpressionBuilder.Value[]> value_replacements = new ArrayList<>(); |
... | ... | |
1121 | 1141 |
ArrayList<Pair<SQLBuilder.TableNameBuilder, FeatureType>> tables = new ArrayList<>(outerTables); |
1122 | 1142 |
collectTablesFromSelect((SelectBuilder) visitable, tables, null); |
1123 | 1143 |
|
1124 |
addTableToColumnReferencesInSingleSelect(sqlbuilder, (SelectBuilder) visitable, tables); |
|
1144 |
addTableToColumnReferencesInSingleSelect(sqlbuilder, (SelectBuilder) visitable, tables, query);
|
|
1125 | 1145 |
return false; |
1126 | 1146 |
} |
1127 | 1147 |
return true; |
... | ... | |
1133 | 1153 |
|
1134 | 1154 |
Pair<SQLBuilder.TableNameBuilder, FeatureType> tableNameAndFeatureType = getTableAndFeatureType(outerTables, variable.name()); |
1135 | 1155 |
if (tableNameAndFeatureType != null) { |
1136 |
SQLBuilder.TableNameBuilder variableTable = tableNameAndFeatureType.getLeft(); |
|
1156 |
|
|
1157 |
if( !isComputed(variable.name(), tableNameAndFeatureType.getRight(), query) ) { |
|
1158 |
|
|
1159 |
SQLBuilder.TableNameBuilder variableTable = tableNameAndFeatureType.getLeft(); |
|
1137 | 1160 |
|
1138 |
if (variable instanceof SQLBuilder.Column) { |
|
1139 |
Column column = (SQLBuilder.Column) variable; |
|
1140 |
if (column.table() != null && column.table().has_name()) { |
|
1141 |
if (column.table().has_schema()) { |
|
1142 |
//La columna tiene tabla y esquema => No hacemos nada |
|
1143 |
} else { |
|
1144 |
if(column.table().getName().equals(variableTable.getName())){ |
|
1145 |
SQLBuilder.TableNameBuilder t = sqlbuilder.createTableNameBuilder() |
|
1146 |
.name(column.table().getName()) |
|
1147 |
.schema(variableTable.getSchema()); |
|
1148 |
variable_replacement = sqlbuilder.column_from( |
|
1149 |
t, |
|
1150 |
variable |
|
1151 |
); |
|
1161 |
if (variable instanceof SQLBuilder.Column) { |
|
1162 |
Column column = (SQLBuilder.Column) variable; |
|
1163 |
if (column.table() != null && column.table().has_name()) { |
|
1164 |
if (column.table().has_schema()) { |
|
1165 |
//La columna tiene tabla y esquema => No hacemos nada |
|
1152 | 1166 |
} else { |
1153 |
if(fromTable.has_schema()){
|
|
1167 |
if(column.table().getName().equals(variableTable.getName())){
|
|
1154 | 1168 |
SQLBuilder.TableNameBuilder t = sqlbuilder.createTableNameBuilder() |
1155 | 1169 |
.name(column.table().getName()) |
1156 |
.schema(fromTable.getSchema()); //Mismo esquema que en el FROM
|
|
1170 |
.schema(variableTable.getSchema());
|
|
1157 | 1171 |
variable_replacement = sqlbuilder.column_from( |
1158 | 1172 |
t, |
1159 | 1173 |
variable |
1160 | 1174 |
); |
1161 | 1175 |
} else { |
1162 |
// No tiene esquema ni podemos averiguarlo => No hacemos nada |
|
1176 |
if(fromTable.has_schema()){ |
|
1177 |
SQLBuilder.TableNameBuilder t = sqlbuilder.createTableNameBuilder() |
|
1178 |
.name(column.table().getName()) |
|
1179 |
.schema(fromTable.getSchema()); //Mismo esquema que en el FROM |
|
1180 |
variable_replacement = sqlbuilder.column_from( |
|
1181 |
t, |
|
1182 |
variable |
|
1183 |
); |
|
1184 |
} else { |
|
1185 |
// No tiene esquema ni podemos averiguarlo => No hacemos nada |
|
1186 |
} |
|
1163 | 1187 |
} |
1164 | 1188 |
} |
1189 |
} else { |
|
1190 |
column = sqlbuilder.column_from(tableNameAndFeatureType.getLeft(), variable); |
|
1191 |
column.setProperty(SQLBuilder.PROP_FEATURE_TYPE, tableNameAndFeatureType.getRight()); |
|
1192 |
variable_replacement = column; |
|
1165 | 1193 |
} |
1166 | 1194 |
} else { |
1167 |
column = sqlbuilder.column_from(tableNameAndFeatureType.getLeft(), variable); |
|
1195 |
Column column = sqlbuilder.column_from(tableNameAndFeatureType.getLeft(), variable);
|
|
1168 | 1196 |
column.setProperty(SQLBuilder.PROP_FEATURE_TYPE, tableNameAndFeatureType.getRight()); |
1169 | 1197 |
variable_replacement = column; |
1170 | 1198 |
} |
1171 |
} else { |
|
1172 |
Column column = sqlbuilder.column_from(tableNameAndFeatureType.getLeft(), variable); |
|
1173 |
column.setProperty(SQLBuilder.PROP_FEATURE_TYPE, tableNameAndFeatureType.getRight()); |
|
1174 |
variable_replacement = column; |
|
1175 | 1199 |
} |
1176 | 1200 |
|
1177 | 1201 |
} else { |
1178 |
if (variable instanceof SQLBuilder.Column) { |
|
1179 |
Column column = (SQLBuilder.Column) variable; |
|
1180 |
if (column.table() == null || !column.table().has_name()) { |
|
1181 |
variable_replacement = sqlbuilder.column_from( |
|
1182 |
fromTable, |
|
1183 |
variable |
|
1184 |
); |
|
1185 |
} else if (!column.table().has_schema()) { |
|
1186 |
if(fromTable.has_schema()){ |
|
1187 |
SQLBuilder.TableNameBuilder t = sqlbuilder.createTableNameBuilder() |
|
1188 |
.name(column.table().getName()) |
|
1189 |
.schema(fromTable.getSchema()); //Mismo esquema que en el FROM |
|
1202 |
if( !isComputed(variable.name(), mainFeatureType, query) ) { |
|
1203 |
|
|
1204 |
if (variable instanceof SQLBuilder.Column) { |
|
1205 |
Column column = (SQLBuilder.Column) variable; |
|
1206 |
if (column.table() == null || !column.table().has_name()) { |
|
1190 | 1207 |
variable_replacement = sqlbuilder.column_from( |
1191 |
t,
|
|
1208 |
fromTable,
|
|
1192 | 1209 |
variable |
1193 | 1210 |
); |
1211 |
} else if (!column.table().has_schema()) { |
|
1212 |
if(fromTable.has_schema()){ |
|
1213 |
SQLBuilder.TableNameBuilder t = sqlbuilder.createTableNameBuilder() |
|
1214 |
.name(column.table().getName()) |
|
1215 |
.schema(fromTable.getSchema()); //Mismo esquema que en el FROM |
|
1216 |
variable_replacement = sqlbuilder.column_from( |
|
1217 |
t, |
|
1218 |
variable |
|
1219 |
); |
|
1220 |
} else { |
|
1221 |
// No tiene esquema ni podemos averiguarlo => No hacemos nada |
|
1222 |
} |
|
1223 |
} |
|
1224 |
} else { |
|
1225 |
if( StringUtils.equals(fromTable.getName(), variable.name()) ) { |
|
1226 |
LOGGER.debug("Uff, la variable coincide con el nombre de la tabla...\nNo esta nada claro que haya que ponerle el prefijo,\nde momento no hacemos nada."); |
|
1194 | 1227 |
} else { |
1195 |
// No tiene esquema ni podemos averiguarlo => No hacemos nada |
|
1228 |
variable_replacement = sqlbuilder.column_from( |
|
1229 |
fromTable, |
|
1230 |
variable |
|
1231 |
); |
|
1196 | 1232 |
} |
1197 | 1233 |
} |
1198 |
} else { |
|
1199 |
if( StringUtils.equals(fromTable.getName(), variable.name()) ) { |
|
1200 |
LOGGER.debug("Uff, la variable coincide con el nombre de la tabla...\nNo esta nada claro que haya que ponerle el prefijo,\nde momento no hacemos nada."); |
|
1201 |
} else { |
|
1202 |
variable_replacement = sqlbuilder.column_from( |
|
1203 |
fromTable, |
|
1204 |
variable |
|
1205 |
); |
|
1206 |
} |
|
1207 | 1234 |
} |
1208 | 1235 |
} |
1209 | 1236 |
if(variable_replacement != null){ |
Also available in: Unified diff