Yes saw that, we can maybe simply comment out the 
EntityTestSuite.testLimitOffsetOptions() method?

Jacques

Adrian Crum wrote:
> This commit makes the framework dependent on the Content component.
> 
> -Adrian
> 
> On 12/15/2012 11:20 AM, jler...@apache.org wrote:
>> Author: jleroux
>> Date: Sat Dec 15 11:20:13 2012
>> New Revision: 1422221
>> 
>> URL: http://svn.apache.org/viewvc?rev=1422221&view=rev
>> Log:
>> A patch from Shi Jinghai for "Support MySQL and Postgres's LIMIT and OFFSET 
>> options"
>> https://issues.apache.org/jira/browse/OFBIZ-4346 
>> 
>> Change the existing code to support the different syntax variations, and add 
>> an attribute to the datasource element in the
>> entityengine.xml file so that the proper variation can be chosen for each 
>> database. Inspired by Moqui code. Test successful
>> 
>> Modified:
>>      ofbiz/trunk/framework/entity/dtd/entity-config.xsd
>>      
>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/config/DatasourceInfo.java
>>      
>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/datasource/GenericDAO.java
>>      
>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/test/EntityTestSuite.java
>>      
>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/util/EntityFindOptions.java
>> 
>> Modified: ofbiz/trunk/framework/entity/dtd/entity-config.xsd
>> URL: 
>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/dtd/entity-config.xsd?rev=1422221&r1=1422220&r2=1422221&view=diff
>> ==============================================================================
>> --- ofbiz/trunk/framework/entity/dtd/entity-config.xsd (original)
>> +++ ofbiz/trunk/framework/entity/dtd/entity-config.xsd Sat Dec 15 11:20:13 
>> 2012
>> @@ -399,6 +399,15 @@ under the License.
>>                   </xs:restriction>
>>               </xs:simpleType>
>>           </xs:attribute>
>> +        <xs:attribute name="offset-style" default="none">
>> +            <xs:simpleType>
>> +                <xs:restriction base="xs:token">
>> +                    <xs:enumeration value="none"/>
>> +                    <xs:enumeration value="fetch"/>
>> +                    <xs:enumeration value="limit"/>
>> +                </xs:restriction>
>> +            </xs:simpleType>
>> +        </xs:attribute>
>>           <xs:attribute type="xs:string" name="table-type"/>
>>           <xs:attribute type="xs:string" name="character-set"/>
>>           <xs:attribute type="xs:string" name="collate"/>
>> 
>> Modified: 
>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/config/DatasourceInfo.java
>> URL:
>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/config/DatasourceInfo.java?rev=1422221&r1=1422220&r2=1422221&view=diff
>> ==============================================================================
>>  ---
>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/config/DatasourceInfo.java 
>> (original) +++
>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/config/DatasourceInfo.java 
>> Sat Dec 15 11:20:13 2012 @@ -72,6 +72,7 @@ public
>>       class DatasourceInfo extends Name public boolean 
>> dropFkUseForeignKeyKeyword = false;
>>       public boolean useBinaryTypeForBlob = false;
>>       public boolean useOrderByNulls = false;
>> +    public String offsetStyle = null;
>>       public String tableType = null;
>>       public String characterSet = null;
>>       public String collate = null;
>> @@ -158,7 +159,8 @@ public class DatasourceInfo extends Name
>>               this.dropFkUseForeignKeyKeyword = 
>> "true".equals(datasourceElement.getAttribute("drop-fk-use-foreign-key-keyword"));
>>               this.useBinaryTypeForBlob = 
>> "true".equals(datasourceElement.getAttribute("use-binary-type-for-blob"));
>>               this.useOrderByNulls = 
>> "true".equals(datasourceElement.getAttribute("use-order-by-nulls"));
>> -
>> +
>> +            this.offsetStyle = 
>> datasourceElement.getAttribute("offset-style");
>>               this.tableType = datasourceElement.getAttribute("table-type");
>>               this.characterSet = 
>> datasourceElement.getAttribute("character-set");
>>               this.collate = datasourceElement.getAttribute("collate");
>> 
>> Modified: 
>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/datasource/GenericDAO.java
>> URL:
>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/datasource/GenericDAO.java?rev=1422221&r1=1422220&r2=1422221&view=diff
>> ==============================================================================
>>  ---
>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/datasource/GenericDAO.java 
>> (original) +++
>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/datasource/GenericDAO.java 
>> Sat Dec 15 11:20:13 2012 @@ -763,6 +763,9 @@ public
>>           class GenericDAO { }
>>           sqlBuffer.append(SqlJdbcUtil.makeOrderByClause(modelEntity, 
>> orderByExpanded, datasourceInfo));
>> 
>> +        // OFFSET clause
>> +        makeOffsetString(sqlBuffer, findOptions);
>> +
>>           // make the final SQL String
>>           String sql = sqlBuffer.toString();
>> 
>> @@ -884,6 +887,29 @@ public class GenericDAO {
>>           return havingString;
>>       }
>> 
>> +    protected StringBuilder makeOffsetString(StringBuilder offsetString, 
>> EntityFindOptions findOptions) {
>> +        if (UtilValidate.isNotEmpty(datasourceInfo.offsetStyle)) {
>> +            if (datasourceInfo.offsetStyle.equals("limit")) {
>> +                // use the LIMIT/OFFSET style
>> +                if (findOptions.getLimit() > -1) {
>> +                    offsetString.append(" LIMIT " + findOptions.getLimit());
>> +                    if (findOptions.getOffset() > -1) {
>> +                        offsetString.append(" OFFSET " + 
>> findOptions.getOffset());
>> +                    }
>> +                }
>> +            } else if (datasourceInfo.offsetStyle.equals("fetch")) {
>> +                // use SQL2008 OFFSET/FETCH style by default
>> +                if (findOptions.getOffset() > -1) {
>> +                    offsetString.append(" OFFSET 
>> ").append(findOptions.getOffset()).append(" ROWS");
>> +                    if (findOptions.getLimit() > -1) {
>> +                        offsetString.append(" FETCH FIRST 
>> ").append(findOptions.getLimit()).append(" ROWS ONLY");
>> +                    }
>> +                }
>> +            }
>> +        }
>> +        return offsetString;
>> +    }
>> +
>>       public List<GenericValue> selectByMultiRelation(GenericValue value, 
>> ModelRelation modelRelationOne, ModelEntity
>>           modelEntityOne, ModelRelation modelRelationTwo, ModelEntity 
>> modelEntityTwo, List<String> orderBy) throws
>>           GenericEntityException { SQLProcessor sqlP = new 
>> SQLProcessor(helperInfo);
>> 
>> Modified: 
>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/test/EntityTestSuite.java
>> URL:
>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/test/EntityTestSuite.java?rev=1422221&r1=1422220&r2=1422221&view=diff
>> ==============================================================================
>>  ---
>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/test/EntityTestSuite.java 
>> (original) +++
>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/test/EntityTestSuite.java 
>> Sat Dec 15 11:20:13 2012 @@ -31,6 +31,7 @@ import
>>   java.util.Map; import org.ofbiz.base.util.Debug;
>>   import org.ofbiz.base.util.UtilDateTime;
>>   import org.ofbiz.base.util.UtilMisc;
>> +import org.ofbiz.base.util.UtilValidate;
>>   import org.ofbiz.base.util.UtilXml;
>>   import org.ofbiz.entity.Delegator;
>>   import org.ofbiz.entity.DelegatorFactory;
>> @@ -44,6 +45,8 @@ import org.ofbiz.entity.condition.Entity
>>   import org.ofbiz.entity.condition.EntityOperator;
>>   import org.ofbiz.entity.config.DatasourceInfo;
>>   import org.ofbiz.entity.config.EntityConfigUtil;
>> +import org.ofbiz.entity.datasource.GenericHelperDAO;
>> +import org.ofbiz.entity.model.ModelEntity;
>>   import org.ofbiz.entity.testtools.EntityTestCase;
>>   import org.ofbiz.entity.transaction.GenericTransactionException;
>>   import org.ofbiz.entity.transaction.TransactionUtil;
>> @@ -604,4 +607,94 @@ public class EntityTestSuite extends Ent
>>           strBufTemp.append(iNum);
>>           return strBufTemp.toString();
>>       }
>> +
>> +    /*
>> +     * This test will verify that the LIMIT and OFFSET options can work 
>> properly.
>> +     */
>> +    public void testLimitOffsetOptions() throws Exception {
>> +        String entityName = "Content";
>> +        DatasourceInfo datasourceInfo =
>> EntityConfigUtil.getDatasourceInfo(delegator.getEntityHelper(entityName).getHelperName());
>>  +        if
>> (UtilValidate.isEmpty(datasourceInfo.offsetStyle) || 
>> datasourceInfo.offsetStyle.equals("none")) { +           
>> Debug.logInfo("The offset-stype configured in datasource is " + 
>> datasourceInfo.offsetStyle +  ", this test is skipped.",
>> module); +            return; +        } else {
>> +            Debug.logInfo("The offset-stype configured in datasource is " + 
>> datasourceInfo.offsetStyle +  ".", module);
>> +        }
>> +        try {
>> +            EntityFindOptions findOptions = new EntityFindOptions();
>> +            long count = delegator.findCountByCondition("Content", null, 
>> null, null);
>> +            Debug.logInfo("Content entity has " + count + " rows", module);
>> +            int rowsPerPage = 10;
>> +            // use rows/page as limit option
>> +            findOptions.setLimit(rowsPerPage);
>> +            int pages = (int) count/rowsPerPage;
>> +            if (count > pages * rowsPerPage) {
>> +                pages += 1;
>> +            }
>> +            Debug.logInfo("These rows will be displayed in " + pages + " 
>> pages, each page has " + rowsPerPage + " rows.",
>> module); +            ModelEntity modelEntity = 
>> delegator.getModelEntity(entityName);
>> +
>> +            long start = UtilDateTime.nowTimestamp().getTime();
>> +            for (int page = 1; page <= pages; page++) {
>> +                Debug.logInfo("Page " + page + ":", module);
>> +                // set offset option
>> +                findOptions.setOffset((page - 1) * rowsPerPage);
>> +                EntityListIterator iterator = null;
>> +                try {
>> +                    iterator = 
>> delegator.getEntityHelper(entityName).findListIteratorByCondition(modelEntity,
>>  null, null, null,
>> UtilMisc.toList("lastUpdatedStamp DESC"), findOptions); +                    
>> while (iterator != null) {
>> +                        GenericValue gv = iterator.next();
>> +                        if (gv == null) {
>> +                            break;
>> +                        }
>> +                        Debug.logInfo(gv.getString("contentId") + ": " + 
>> gv.getString("contentName") + "       (updated: " +
>> gv.getTimestamp("lastUpdatedStamp") + ")", module); +                    }
>> +                } catch (GenericEntityException e) {
>> +                    Debug.logError(e, module);
>> +                } finally {
>> +                    if (iterator != null) {
>> +                        iterator.close();
>> +                    }
>> +                }
>> +            }
>> +            long end = UtilDateTime.nowTimestamp().getTime();
>> +            long time1 = end - start;
>> +            Debug.logInfo("Time consumed WITH limit and offset option (ms): 
>> " + time1, module);
>> +
>> +            start = UtilDateTime.nowTimestamp().getTime();
>> +            for (int page = 1; page <= pages; page++) {
>> +                Debug.logInfo("Page " + page + ":", module);
>> +                EntityListIterator iterator = null;
>> +                try {
>> +                    iterator = ((GenericHelperDAO)
>> delegator.getEntityHelper(entityName)).findListIteratorByCondition(modelEntity,
>>  null, null, null,
>> UtilMisc.toList("lastUpdatedStamp DESC"), null); +                    if 
>> (iterator == null) { +                        continue;
>> +                    }
>> +                    iterator.setDelegator(delegator);
>> +                    List<GenericValue> gvs = iterator.getCompleteList();
>> +                    int fromIndex = (page - 1) * rowsPerPage;
>> +                    int toIndex = fromIndex + rowsPerPage;
>> +                    if (toIndex > count) {
>> +                        toIndex = (int) count;
>> +                    }
>> +                    gvs = gvs.subList(fromIndex, toIndex);
>> +                    for (GenericValue gv : gvs) {
>> +                        Debug.logInfo(gv.getString("contentId") + ": " + 
>> gv.getString("contentName") + "       (updated: " +
>> gv.getTimestamp("lastUpdatedStamp") + ")", module); +                    }
>> +                } catch (GenericEntityException e) {
>> +                    Debug.logError(e, module);
>> +                } finally {
>> +                    if (iterator != null) {
>> +                        iterator.close();
>> +                    }
>> +                }
>> +            }
>> +            end = UtilDateTime.nowTimestamp().getTime();
>> +            long time2 = end - start;
>> +            Debug.logInfo("Time consumed WITHOUT limit and offset option 
>> (ms): " + time2, module);
>> +            Debug.logInfo("Time saved (ms): " + (time2 - time1), module);
>> +        } catch (GenericEntityException e) {
>> +            Debug.logError(e, module);
>> +        }
>> +    }
>>   }
>> 
>> Modified: 
>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/util/EntityFindOptions.java
>> URL:
>> http://svn.apache.org/viewvc/ofbiz/trunk/framework/entity/src/org/ofbiz/entity/util/EntityFindOptions.java?rev=1422221&r1=1422220&r2=1422221&view=diff
>> ==============================================================================
>>  ---
>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/util/EntityFindOptions.java
>>  (original) +++
>> ofbiz/trunk/framework/entity/src/org/ofbiz/entity/util/EntityFindOptions.java
>>  Sat Dec 15 11:20:13 2012 @@ -48,6 +48,12 @@ public
>>       class EntityFindOptions implement protected int maxRows = -1;
>>       protected boolean distinct = false;
>> 
>> +    /** LIMIT option */
>> +    protected int limit = -1;
>> +
>> +    /** OFFSET option */
>> +    protected int offset = -1;
>> +
>>       /** Default constructor. Defaults are as follows:
>>        *      specifyTypeAndConcur = true
>>        *      resultSetType = TYPE_FORWARD_ONLY
>> @@ -145,4 +151,25 @@ public class EntityFindOptions implement
>>       public void setDistinct(boolean distinct) {
>>           this.distinct = distinct;
>>       }
>> +
>> +
>> +    /** Get the LIMIT number. */
>> +    public int getLimit() {
>> +        return limit;
>> +    }
>> +
>> +    /** Specifies the LIMIT number. */
>> +    public void setLimit(int limit) {
>> +        this.limit = limit;
>> +    }
>> +
>> +    /** Get the OFFSET number. */
>> +    public int getOffset() {
>> +        return offset;
>> +    }
>> +
>> +    /** Specifies the OFFSET number. */
>> +    public void setOffset(int offset) {
>> +        this.offset = offset;
>> +    }
>>   }

Reply via email to