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

View differences:

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