You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ofbiz.apache.org by do...@apache.org on 2010/05/26 16:22:21 UTC

svn commit: r948440 - in /ofbiz/trunk/framework/entity: dtd/entitymodel.xsd src/org/ofbiz/entity/jdbc/DatabaseUtil.java src/org/ofbiz/entity/model/ModelIndex.java

Author: doogie
Date: Wed May 26 14:22:21 2010
New Revision: 948440

URL: http://svn.apache.org/viewvc?rev=948440&view=rev
Log:
Add support for UPPER and LOWER functions in index fields.

Modified:
    ofbiz/trunk/framework/entity/dtd/entitymodel.xsd
    ofbiz/trunk/framework/entity/src/org/ofbiz/entity/jdbc/DatabaseUtil.java
    ofbiz/trunk/framework/entity/src/org/ofbiz/entity/model/ModelIndex.java

Modified: ofbiz/trunk/framework/entity/dtd/entitymodel.xsd
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/dtd/entitymodel.xsd?rev=948440&r1=948439&r2=948440&view=diff
==============================================================================
--- ofbiz/trunk/framework/entity/dtd/entitymodel.xsd (original)
+++ ofbiz/trunk/framework/entity/dtd/entitymodel.xsd Wed May 26 14:22:21 2010
@@ -202,6 +202,14 @@ under the License.
     </xs:element>
     <xs:attributeGroup name="attlist.index-field">
         <xs:attribute name="name" type="xs:string" use="required"/>
+        <xs:attribute name="function">
+            <xs:simpleType>
+                <xs:restriction base="xs:token">
+                    <xs:enumeration value="lower"/>
+                    <xs:enumeration value="upper"/>
+                </xs:restriction>
+            </xs:simpleType>
+        </xs:attribute>
     </xs:attributeGroup>
     
     <!-- ================== view-entity ===================== -->

Modified: ofbiz/trunk/framework/entity/src/org/ofbiz/entity/jdbc/DatabaseUtil.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/jdbc/DatabaseUtil.java?rev=948440&r1=948439&r2=948440&view=diff
==============================================================================
--- ofbiz/trunk/framework/entity/src/org/ofbiz/entity/jdbc/DatabaseUtil.java (original)
+++ ofbiz/trunk/framework/entity/src/org/ofbiz/entity/jdbc/DatabaseUtil.java Wed May 26 14:22:21 2010
@@ -2800,16 +2800,23 @@ public class DatabaseUtil {
     }
 
     public String makeIndexClause(ModelEntity entity, ModelIndex modelIndex) {
-        Iterator<String> fieldNamesIter = modelIndex.getIndexFieldsIterator();
+        Iterator<ModelIndex.Field> fieldsIter = modelIndex.getFieldsIterator();
         StringBuilder mainCols = new StringBuilder();
 
-        while (fieldNamesIter.hasNext()) {
-            String fieldName = fieldNamesIter.next();
-            ModelField mainField = entity.getField(fieldName);
+        while (fieldsIter.hasNext()) {
+            ModelIndex.Field field = fieldsIter.next();
+            ModelIndex.Function function = field.getFunction();
             if (mainCols.length() > 0) {
                 mainCols.append(", ");
             }
+            if (function != null) {
+                mainCols.append(function.toString()).append('(');
+            }
+            ModelField mainField = entity.getField(field.getFieldName());
             mainCols.append(mainField.getColName());
+            if (function != null) {
+                mainCols.append(')');
+            }
         }
 
         StringBuilder indexSqlBuf = new StringBuilder("CREATE ");

Modified: ofbiz/trunk/framework/entity/src/org/ofbiz/entity/model/ModelIndex.java
URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/model/ModelIndex.java?rev=948440&r1=948439&r2=948440&view=diff
==============================================================================
--- ofbiz/trunk/framework/entity/src/org/ofbiz/entity/model/ModelIndex.java (original)
+++ ofbiz/trunk/framework/entity/src/org/ofbiz/entity/model/ModelIndex.java Wed May 26 14:22:21 2010
@@ -27,7 +27,9 @@ import org.w3c.dom.Element;
 import org.w3c.dom.NodeList;
 
 import org.ofbiz.base.util.StringUtil;
+import org.ofbiz.base.util.UtilValidate;
 import org.ofbiz.base.util.UtilXml;
+import org.ofbiz.base.util.collections.IteratorWrapper;
 
 /**
  * Generic Entity - Relation model class
@@ -42,7 +44,7 @@ public class ModelIndex extends ModelChi
     protected boolean unique;
 
     /** list of the field names included in this index */
-    protected List<String> fieldNames = new ArrayList<String>();
+    protected List<Field> fields = new ArrayList<Field>();
 
     /** Default Constructor */
     public ModelIndex() {
@@ -71,7 +73,8 @@ public class ModelIndex extends ModelChi
 
             if (indexFieldElement.getParentNode() == indexElement) {
                 String fieldName = indexFieldElement.getAttribute("name").intern();
-                this.fieldNames.add(fieldName);
+                String function = indexFieldElement.getAttribute("function");
+                this.fields.add(new Field(fieldName, UtilValidate.isNotEmpty(function) ? Function.valueOf(function.toUpperCase()) : null));
             }
         }
     }
@@ -94,24 +97,45 @@ public class ModelIndex extends ModelChi
         this.unique = unique;
     }
 
+    /** @deprecated use getFieldsIterator() */
+    @Deprecated
     public Iterator<String> getIndexFieldsIterator() {
-        return this.fieldNames.iterator();
+        return new IteratorWrapper<String, Field>(this.fields.iterator()) {
+            protected void noteRemoval(String dest, Field src) {
+            }
+
+            protected String convert(Field src) {
+                return src.getFieldName();
+            }
+        };
+    }
+
+    public Iterator<Field> getFieldsIterator() {
+        return this.fields.iterator();
     }
 
     public int getIndexFieldsSize() {
-        return this.fieldNames.size();
+        return this.fields.size();
     }
 
     public String getIndexField(int index) {
-        return this.fieldNames.get(index);
+        return this.fields.get(index).getFieldName();
     }
 
     public void addIndexField(String fieldName) {
-        this.fieldNames.add(fieldName);
+        this.fields.add(new Field(fieldName, null));
+    }
+
+    public void addIndexField(String fieldName, String functionName) {
+        this.fields.add(new Field(fieldName, Function.valueOf(functionName)));
+    }
+
+    public void addIndexField(String fieldName, Function function) {
+        this.fields.add(new Field(fieldName, function));
     }
 
     public String removeIndexField(int index) {
-        return this.fieldNames.remove(index);
+        return this.fields.remove(index).getFieldName();
     }
 
     public Element toXmlElement(Document document) {
@@ -121,12 +145,43 @@ public class ModelIndex extends ModelChi
             root.setAttribute("unique", "true");
         }
 
-        for (String fieldName: this.fieldNames) {
+        for (Field field: this.fields) {
             Element fn = document.createElement("index-field");
-            fn.setAttribute("name", fieldName);
+            fn.setAttribute("name", field.getFieldName());
+            if (field.getFunction() != null) {
+                fn.setAttribute("function", field.getFunction().toString());
+            }
             root.appendChild(fn);
         }
 
         return root;
     }
+
+    public static final class Field {
+        private final String fieldName;
+        private final Function function;
+
+        public Field(String fieldName, Function function) {
+            this.fieldName = fieldName;
+            this.function = function;
+        }
+
+        public String getFieldName() {
+            return this.fieldName;
+        }
+
+        public Function getFunction() {
+            return function;
+        }
+
+        public String toString() {
+            if (function == null) {
+                return fieldName;
+            } else {
+                return function.toString() + '(' + fieldName + ')';
+            }
+        }
+    }
+
+    public enum Function { LOWER, UPPER }
 }



Re: svn commit: r948440 - in /ofbiz/trunk/framework/entity: dtd/entitymodel.xsd src/org/ofbiz/entity/jdbc/DatabaseUtil.java src/org/ofbiz/entity/model/ModelIndex.java

Posted by Adam Heath <do...@brainfood.com>.
doogie@apache.org wrote:
> Author: doogie
> Date: Wed May 26 14:22:21 2010
> New Revision: 948440
> 
> URL: http://svn.apache.org/viewvc?rev=948440&view=rev
> Log:
> Add support for UPPER and LOWER functions in index fields.

<extend-entity entity-name="Person">
 <index name="perLowerFirstName">
  <index-field name="firstName" function="lower"/>
 </index>
 <index name="perLowerMiddleName">
  <index-field name="middleName" function="lower"/>
 </index>
 <index name="perLowerLastName">
  <index-field name="lastName" function="lower"/>
 </index>
</extend-entity>

So that when an EntityCondition does a comparison against one of those
fields, but converts it to lowercase, the database can still do an
index lookup, instead of a sequential scan.

The sql is: CREATE INDEX perLowerFirstName ON public.PERSON
(LOWER(FIRST_NAME));

> Modified:
>     ofbiz/trunk/framework/entity/dtd/entitymodel.xsd
>     ofbiz/trunk/framework/entity/src/org/ofbiz/entity/jdbc/DatabaseUtil.java
>     ofbiz/trunk/framework/entity/src/org/ofbiz/entity/model/ModelIndex.java
> 
> Modified: ofbiz/trunk/framework/entity/dtd/entitymodel.xsd
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/dtd/entitymodel.xsd?rev=948440&r1=948439&r2=948440&view=diff
> ==============================================================================
> --- ofbiz/trunk/framework/entity/dtd/entitymodel.xsd (original)
> +++ ofbiz/trunk/framework/entity/dtd/entitymodel.xsd Wed May 26 14:22:21 2010
> @@ -202,6 +202,14 @@ under the License.
>      </xs:element>
>      <xs:attributeGroup name="attlist.index-field">
>          <xs:attribute name="name" type="xs:string" use="required"/>
> +        <xs:attribute name="function">
> +            <xs:simpleType>
> +                <xs:restriction base="xs:token">
> +                    <xs:enumeration value="lower"/>
> +                    <xs:enumeration value="upper"/>
> +                </xs:restriction>
> +            </xs:simpleType>
> +        </xs:attribute>
>      </xs:attributeGroup>
>      
>      <!-- ================== view-entity ===================== -->
> 
> Modified: ofbiz/trunk/framework/entity/src/org/ofbiz/entity/jdbc/DatabaseUtil.java
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/jdbc/DatabaseUtil.java?rev=948440&r1=948439&r2=948440&view=diff
> ==============================================================================
> --- ofbiz/trunk/framework/entity/src/org/ofbiz/entity/jdbc/DatabaseUtil.java (original)
> +++ ofbiz/trunk/framework/entity/src/org/ofbiz/entity/jdbc/DatabaseUtil.java Wed May 26 14:22:21 2010
> @@ -2800,16 +2800,23 @@ public class DatabaseUtil {
>      }
>  
>      public String makeIndexClause(ModelEntity entity, ModelIndex modelIndex) {
> -        Iterator<String> fieldNamesIter = modelIndex.getIndexFieldsIterator();
> +        Iterator<ModelIndex.Field> fieldsIter = modelIndex.getFieldsIterator();
>          StringBuilder mainCols = new StringBuilder();
>  
> -        while (fieldNamesIter.hasNext()) {
> -            String fieldName = fieldNamesIter.next();
> -            ModelField mainField = entity.getField(fieldName);
> +        while (fieldsIter.hasNext()) {
> +            ModelIndex.Field field = fieldsIter.next();
> +            ModelIndex.Function function = field.getFunction();
>              if (mainCols.length() > 0) {
>                  mainCols.append(", ");
>              }
> +            if (function != null) {
> +                mainCols.append(function.toString()).append('(');
> +            }
> +            ModelField mainField = entity.getField(field.getFieldName());
>              mainCols.append(mainField.getColName());
> +            if (function != null) {
> +                mainCols.append(')');
> +            }
>          }
>  
>          StringBuilder indexSqlBuf = new StringBuilder("CREATE ");
> 
> Modified: ofbiz/trunk/framework/entity/src/org/ofbiz/entity/model/ModelIndex.java
> URL: http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/model/ModelIndex.java?rev=948440&r1=948439&r2=948440&view=diff
> ==============================================================================
> --- ofbiz/trunk/framework/entity/src/org/ofbiz/entity/model/ModelIndex.java (original)
> +++ ofbiz/trunk/framework/entity/src/org/ofbiz/entity/model/ModelIndex.java Wed May 26 14:22:21 2010
> @@ -27,7 +27,9 @@ import org.w3c.dom.Element;
>  import org.w3c.dom.NodeList;
>  
>  import org.ofbiz.base.util.StringUtil;
> +import org.ofbiz.base.util.UtilValidate;
>  import org.ofbiz.base.util.UtilXml;
> +import org.ofbiz.base.util.collections.IteratorWrapper;
>  
>  /**
>   * Generic Entity - Relation model class
> @@ -42,7 +44,7 @@ public class ModelIndex extends ModelChi
>      protected boolean unique;
>  
>      /** list of the field names included in this index */
> -    protected List<String> fieldNames = new ArrayList<String>();
> +    protected List<Field> fields = new ArrayList<Field>();
>  
>      /** Default Constructor */
>      public ModelIndex() {
> @@ -71,7 +73,8 @@ public class ModelIndex extends ModelChi
>  
>              if (indexFieldElement.getParentNode() == indexElement) {
>                  String fieldName = indexFieldElement.getAttribute("name").intern();
> -                this.fieldNames.add(fieldName);
> +                String function = indexFieldElement.getAttribute("function");
> +                this.fields.add(new Field(fieldName, UtilValidate.isNotEmpty(function) ? Function.valueOf(function.toUpperCase()) : null));
>              }
>          }
>      }
> @@ -94,24 +97,45 @@ public class ModelIndex extends ModelChi
>          this.unique = unique;
>      }
>  
> +    /** @deprecated use getFieldsIterator() */
> +    @Deprecated
>      public Iterator<String> getIndexFieldsIterator() {
> -        return this.fieldNames.iterator();
> +        return new IteratorWrapper<String, Field>(this.fields.iterator()) {
> +            protected void noteRemoval(String dest, Field src) {
> +            }
> +
> +            protected String convert(Field src) {
> +                return src.getFieldName();
> +            }
> +        };
> +    }
> +
> +    public Iterator<Field> getFieldsIterator() {
> +        return this.fields.iterator();
>      }
>  
>      public int getIndexFieldsSize() {
> -        return this.fieldNames.size();
> +        return this.fields.size();
>      }
>  
>      public String getIndexField(int index) {
> -        return this.fieldNames.get(index);
> +        return this.fields.get(index).getFieldName();
>      }
>  
>      public void addIndexField(String fieldName) {
> -        this.fieldNames.add(fieldName);
> +        this.fields.add(new Field(fieldName, null));
> +    }
> +
> +    public void addIndexField(String fieldName, String functionName) {
> +        this.fields.add(new Field(fieldName, Function.valueOf(functionName)));
> +    }
> +
> +    public void addIndexField(String fieldName, Function function) {
> +        this.fields.add(new Field(fieldName, function));
>      }
>  
>      public String removeIndexField(int index) {
> -        return this.fieldNames.remove(index);
> +        return this.fields.remove(index).getFieldName();
>      }
>  
>      public Element toXmlElement(Document document) {
> @@ -121,12 +145,43 @@ public class ModelIndex extends ModelChi
>              root.setAttribute("unique", "true");
>          }
>  
> -        for (String fieldName: this.fieldNames) {
> +        for (Field field: this.fields) {
>              Element fn = document.createElement("index-field");
> -            fn.setAttribute("name", fieldName);
> +            fn.setAttribute("name", field.getFieldName());
> +            if (field.getFunction() != null) {
> +                fn.setAttribute("function", field.getFunction().toString());
> +            }
>              root.appendChild(fn);
>          }
>  
>          return root;
>      }
> +
> +    public static final class Field {
> +        private final String fieldName;
> +        private final Function function;
> +
> +        public Field(String fieldName, Function function) {
> +            this.fieldName = fieldName;
> +            this.function = function;
> +        }
> +
> +        public String getFieldName() {
> +            return this.fieldName;
> +        }
> +
> +        public Function getFunction() {
> +            return function;
> +        }
> +
> +        public String toString() {
> +            if (function == null) {
> +                return fieldName;
> +            } else {
> +                return function.toString() + '(' + fieldName + ')';
> +            }
> +        }
> +    }
> +
> +    public enum Function { LOWER, UPPER }
>  }
> 
>