# HG changeset patch
# User Shankar Balachandran <shankar.balachandran@openbravo.com>
# Date 1351446613 -3600
# Node ID 39e636c10b13d93150ce913879c82715ebe25fda
# Parent  7ded3cc90bf440d66cbc1dcb455dba4e95beeb02
Fixes Issue 0022007 : Handling null values in filter by identifiers.

Added a new method replaceValueWithJoins to handle cases where joins are formed but the property path is used to compare with values.
For eg., instead of join_4.description, e.product.attributeSetValue.description is used in the where clause which results in exception when nullobjects are sub referenced.

diff --git a/modules/org.openbravo.service.json/src/org/openbravo/service/json/AdvancedQueryBuilder.java b/modules/org.openbravo.service.json/src/org/openbravo/service/json/AdvancedQueryBuilder.java
--- a/modules/org.openbravo.service.json/src/org/openbravo/service/json/AdvancedQueryBuilder.java
+++ b/modules/org.openbravo.service.json/src/org/openbravo/service/json/AdvancedQueryBuilder.java
@@ -708,7 +708,7 @@
         && (operator.equals(OPERATOR_GREATERTHAN) || operator.equals(OPERATOR_GREATEROREQUAL)
             || operator.equals(OPERATOR_IGREATERTHAN) || operator.equals(OPERATOR_IGREATEROREQUAL)
             || operator.equals(OPERATOR_GREATERTHANFIElD) || operator
-            .equals(OPERATOR_GREATEROREQUALFIELD));
+              .equals(OPERATOR_GREATEROREQUALFIELD));
   }
 
   private boolean isLesserOperator(String operator) {
@@ -716,7 +716,7 @@
         && (operator.equals(OPERATOR_LESSTHAN) || operator.equals(OPERATOR_LESSOREQUAL)
             || operator.equals(OPERATOR_ILESSTHAN) || operator.equals(OPERATOR_ILESSOREQUAL)
             || operator.equals(OPERATOR_LESSTHANFIELD) || operator
-            .equals(OPERATOR_LESSOREQUALFIElD));
+              .equals(OPERATOR_LESSOREQUALFIElD));
   }
 
   private String computeLeftWhereClauseForIdentifier(Property property, String key,
@@ -1187,10 +1187,10 @@
               + " from " + prop.getTranslationProperty().getEntity().getName() + " as t where t."
               + prop.getTrlParentProperty().getName() + " = "
               + prefix.substring(0, prefix.lastIndexOf('.')) + " and t.language.language='"
-              + OBContext.getOBContext().getLanguage().getLanguage() + "')), to_char(" + prefix
-              + prop.getName() + "), '')");
+              + OBContext.getOBContext().getLanguage().getLanguage() + "')), to_char("
+              + replaceValueWithJoins(prefix + prop.getName()) + "), '')");
         } else {
-          sb.append("COALESCE(to_char(" + prefix + prop.getName() + "),'')");
+          sb.append("COALESCE(to_char(" + replaceValueWithJoins(prefix + prop.getName()) + "),'')");
         }
 
       } else {
@@ -1204,6 +1204,32 @@
     return "(" + sb.toString() + ")";
   }
 
+  /*
+   * To handle cases where joins are formed but the property path is used to compare with values.
+   * For eg., instead of join_4.description, e.product.attributeSetValue.description is used in
+   * where clause which results in exception when null objects are sub referenced.Refer issue
+   * https://issues.openbravo.com/view.php?id=22007
+   */
+  private String replaceValueWithJoins(String value) {
+    String query = value;
+    String compare = value.substring(0, value.lastIndexOf(DalUtil.DOT));
+    String properties[] = value.split("\\.");
+    if (properties.length > 2) {
+      for (JoinDefinition join : joinDefinitions) {
+        if (compare.contains("join")) {
+          if (properties[0].equalsIgnoreCase(join.ownerAlias)) {
+            return join.joinAlias + DalUtil.DOT + properties[properties.length - 1];
+          }
+        } else {
+          if (compare.equalsIgnoreCase(getMainAlias() + DalUtil.DOT + join.property)) {
+            return join.joinAlias + DalUtil.DOT + properties[properties.length - 1];
+          }
+        }
+      }
+    }
+    return query;
+  }
+
   /**
    * @return true if one of the filter parameters is the {@link JsonConstants#ORG_PARAMETER}.
    */
