details: https://code.openbravo.com/erp/devel/pi/rev/7d077afe4a18 changeset: 16748:7d077afe4a18 user: Martin Taal <martin.taal <at> openbravo.com> date: Mon Jun 04 21:05:48 2012 +0200 summary: Fixes issue 20666: Allow creation of proxy when setting property in business object
details: https://code.openbravo.com/erp/devel/pi/rev/0f69dacb316f changeset: 16749:0f69dacb316f user: Martin Taal <martin.taal <at> openbravo.com> date: Tue Jun 05 13:06:49 2012 +0200 summary: Related to issue 20515: Slow OBCriteria Change the way order by is done to follow the standard approach of hibernate Criteria, resulting in a better joining of the order by table/property details: https://code.openbravo.com/erp/devel/pi/rev/a0b44c4d6906 changeset: 16750:a0b44c4d6906 user: Martin Taal <martin.taal <at> openbravo.com> date: Tue Jun 05 13:07:50 2012 +0200 summary: Fixes issue 20611: OBCriteria doesn't support ScrollabeResults Use the entity name instead of the classname to initialize the hibernate criteria details: https://code.openbravo.com/erp/devel/pi/rev/551e33daa248 changeset: 16751:551e33daa248 user: Martin Taal <martin.taal <at> openbravo.com> date: Tue Jun 05 13:08:30 2012 +0200 summary: Related to issue 20515: Slow OBCriteria Enhanced obcriteria testcase details: https://code.openbravo.com/erp/devel/pi/rev/f91001dc95e5 changeset: 16752:f91001dc95e5 user: Martin Taal <martin.taal <at> openbravo.com> date: Tue Jun 05 15:34:12 2012 +0200 summary: Related to issue 20515: Slow OBCriteria Some additional test queries and printing of results diffstat: modules/org.openbravo.service.json/src/org/openbravo/service/json/JsonToDataConverter.java | 4 +- src-test/org/openbravo/test/AllAntTaskTests.java | 4 +- src-test/org/openbravo/test/AllQuickAntTaskTests.java | 4 +- src-test/org/openbravo/test/AllTests.java | 4 +- src-test/org/openbravo/test/AntTaskTests.java | 4 +- src-test/org/openbravo/test/dal/DalPerformanceCriteriaTest.java | 461 ++++++++++ src-test/org/openbravo/test/dal/DalPerformanceProxyTest.java | 146 +++ src-test/org/openbravo/test/dal/IssuesTest.java | 12 + src/org/openbravo/base/model/domaintype/BaseForeignKeyDomainType.java | 26 +- src/org/openbravo/dal/service/OBCriteria.java | 3 +- src/org/openbravo/dal/service/OBDal.java | 31 +- 11 files changed, 687 insertions(+), 12 deletions(-) diffs (truncated from 923 to 300 lines): diff -r b9a5fed6dd96 -r f91001dc95e5 modules/org.openbravo.service.json/src/org/openbravo/service/json/JsonToDataConverter.java --- a/modules/org.openbravo.service.json/src/org/openbravo/service/json/JsonToDataConverter.java Tue Jun 05 15:08:23 2012 +0200 +++ b/modules/org.openbravo.service.json/src/org/openbravo/service/json/JsonToDataConverter.java Tue Jun 05 15:34:12 2012 +0200 @@ -556,7 +556,9 @@ if (keyToObject.get(key) != null) { value = keyToObject.get(key); } else { - if (property.getReferencedProperty() != null) { + // if an id we should use the get method as it loads from the first level + // cache + if (property.getReferencedProperty() != null && !property.getReferencedProperty().isId()) { final OBQuery<BaseOBObject> qry = OBDal.getInstance().createQuery(entity.getName(), property.getReferencedProperty().getName() + "=:reference"); qry.setNamedParameter("reference", referencedId); diff -r b9a5fed6dd96 -r f91001dc95e5 src-test/org/openbravo/test/AllAntTaskTests.java --- a/src-test/org/openbravo/test/AllAntTaskTests.java Tue Jun 05 15:08:23 2012 +0200 +++ b/src-test/org/openbravo/test/AllAntTaskTests.java Tue Jun 05 15:34:12 2012 +0200 @@ -11,7 +11,7 @@ * under the License. * The Original Code is Openbravo ERP. * The Initial Developer of the Original Code is Openbravo SLU - * All portions are Copyright (C) 2009-2011 Openbravo SLU + * All portions are Copyright (C) 2009-2012 Openbravo SLU * All Rights Reserved. * Contributor(s): ______________________________________. ************************************************************************ @@ -30,6 +30,7 @@ import org.openbravo.test.dal.DalFilterTest; import org.openbravo.test.dal.DalPerformanceInventoryLineTest; import org.openbravo.test.dal.DalPerformanceProductTest; +import org.openbravo.test.dal.DalPerformanceProxyTest; import org.openbravo.test.dal.DalQueryTest; import org.openbravo.test.dal.DalStoredProcedureTest; import org.openbravo.test.dal.DalTest; @@ -86,6 +87,7 @@ suite.addTestSuite(DalComplexQueryTestOrderLine.class); suite.addTestSuite(DalPerformanceInventoryLineTest.class); suite.addTestSuite(DalPerformanceProductTest.class); + suite.addTestSuite(DalPerformanceProxyTest.class); suite.addTestSuite(DalQueryTest.class); suite.addTestSuite(DalFilterTest.class); suite.addTestSuite(DalTest.class); diff -r b9a5fed6dd96 -r f91001dc95e5 src-test/org/openbravo/test/AllQuickAntTaskTests.java --- a/src-test/org/openbravo/test/AllQuickAntTaskTests.java Tue Jun 05 15:08:23 2012 +0200 +++ b/src-test/org/openbravo/test/AllQuickAntTaskTests.java Tue Jun 05 15:34:12 2012 +0200 @@ -11,7 +11,7 @@ * under the License. * The Original Code is Openbravo ERP. * The Initial Developer of the Original Code is Openbravo SLU - * All portions are Copyright (C) 2009-2011 Openbravo SLU + * All portions are Copyright (C) 2009-2012 Openbravo SLU * All Rights Reserved. * Contributor(s): ______________________________________. ************************************************************************ @@ -26,6 +26,7 @@ import org.openbravo.test.dal.AdminContextTest; import org.openbravo.test.dal.DalConnectionProviderTest; import org.openbravo.test.dal.DalFilterTest; +import org.openbravo.test.dal.DalPerformanceProxyTest; import org.openbravo.test.dal.DalStoredProcedureTest; import org.openbravo.test.dal.DalTest; import org.openbravo.test.dal.DalUtilTest; @@ -72,6 +73,7 @@ // suite.addTestSuite(DalPerformanceInventoryLineTest.class); // suite.addTestSuite(DalPerformanceProductTest.class); // suite.addTestSuite(DalQueryTest.class); + suite.addTestSuite(DalPerformanceProxyTest.class); suite.addTestSuite(DalTest.class); suite.addTestSuite(DalFilterTest.class); suite.addTestSuite(DalUtilTest.class); diff -r b9a5fed6dd96 -r f91001dc95e5 src-test/org/openbravo/test/AllTests.java --- a/src-test/org/openbravo/test/AllTests.java Tue Jun 05 15:08:23 2012 +0200 +++ b/src-test/org/openbravo/test/AllTests.java Tue Jun 05 15:34:12 2012 +0200 @@ -11,7 +11,7 @@ * under the License. * The Original Code is Openbravo ERP. * The Initial Developer of the Original Code is Openbravo SLU - * All portions are Copyright (C) 2008-2011 Openbravo SLU + * All portions are Copyright (C) 2008-2012 Openbravo SLU * All Rights Reserved. * Contributor(s): ______________________________________. ************************************************************************ @@ -26,6 +26,7 @@ import org.openbravo.test.dal.DalConnectionProviderTest; import org.openbravo.test.dal.DalCopyTest; import org.openbravo.test.dal.DalFilterTest; +import org.openbravo.test.dal.DalPerformanceProxyTest; import org.openbravo.test.dal.DalQueryTest; import org.openbravo.test.dal.DalStoredProcedureTest; import org.openbravo.test.dal.DalTest; @@ -79,6 +80,7 @@ suite.addTestSuite(DalCopyTest.class); suite.addTestSuite(DalStoredProcedureTest.class); suite.addTestSuite(ReadByNameTest.class); + suite.addTestSuite(DalPerformanceProxyTest.class); // model suite.addTestSuite(RuntimeModelTest.class); diff -r b9a5fed6dd96 -r f91001dc95e5 src-test/org/openbravo/test/AntTaskTests.java --- a/src-test/org/openbravo/test/AntTaskTests.java Tue Jun 05 15:08:23 2012 +0200 +++ b/src-test/org/openbravo/test/AntTaskTests.java Tue Jun 05 15:34:12 2012 +0200 @@ -11,7 +11,7 @@ * under the License. * The Original Code is Openbravo ERP. * The Initial Developer of the Original Code is Openbravo SLU - * All portions are Copyright (C) 2009-2011 Openbravo SLU + * All portions are Copyright (C) 2009-2012 Openbravo SLU * All Rights Reserved. * Contributor(s): ______________________________________. ************************************************************************ @@ -29,6 +29,7 @@ import org.openbravo.test.dal.DalCopyTest; import org.openbravo.test.dal.DalPerformanceInventoryLineTest; import org.openbravo.test.dal.DalPerformanceProductTest; +import org.openbravo.test.dal.DalPerformanceProxyTest; import org.openbravo.test.dal.DalQueryTest; import org.openbravo.test.dal.DalStoredProcedureTest; import org.openbravo.test.dal.DalTest; @@ -86,6 +87,7 @@ suite.addTestSuite(DalComplexQueryTestOrderLine.class); suite.addTestSuite(DalPerformanceInventoryLineTest.class); suite.addTestSuite(DalPerformanceProductTest.class); + suite.addTestSuite(DalPerformanceProxyTest.class); suite.addTestSuite(DalQueryTest.class); suite.addTestSuite(DalConnectionProviderTest.class); suite.addTestSuite(DalTest.class); diff -r b9a5fed6dd96 -r f91001dc95e5 src-test/org/openbravo/test/dal/DalPerformanceCriteriaTest.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src-test/org/openbravo/test/dal/DalPerformanceCriteriaTest.java Tue Jun 05 15:34:12 2012 +0200 @@ -0,0 +1,461 @@ +/* + ************************************************************************* + * The contents of this file are subject to the Openbravo Public License + * Version 1.1 (the "License"), being the Mozilla Public License + * Version 1.1 with a permitted attribution clause; you may not use this + * file except in compliance with the License. You may obtain a copy of + * the License at http://www.openbravo.com/legal/license.html + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the + * License for the specific language governing rights and limitations + * under the License. + * The Original Code is Openbravo ERP. + * The Initial Developer of the Original Code is Openbravo SLU + * All portions are Copyright (C) 2012 Openbravo SLU + * All Rights Reserved. + * Contributor(s): ______________________________________. + ************************************************************************ + */ + +package org.openbravo.test.dal; + +import java.io.Serializable; +import java.util.List; +import java.util.UUID; + +import org.hibernate.ScrollMode; +import org.hibernate.ScrollableResults; +import org.hibernate.criterion.Restrictions; +import org.hibernate.engine.SessionImplementor; +import org.junit.Assert; +import org.openbravo.base.exception.OBException; +import org.openbravo.base.provider.OBProvider; +import org.openbravo.base.structure.BaseOBObject; +import org.openbravo.dal.service.OBCriteria; +import org.openbravo.dal.service.OBDal; +import org.openbravo.dal.service.OBQuery; +import org.openbravo.model.ad.datamodel.Table; +import org.openbravo.model.common.businesspartner.BusinessPartner; +import org.openbravo.model.common.businesspartner.Category; +import org.openbravo.model.common.currency.Currency; +import org.openbravo.model.common.plm.Product; +import org.openbravo.model.materialmgmt.transaction.MaterialTransaction; +import org.openbravo.test.base.BaseTest; + +/** + * Test case to try and test proxy loading or stateless sessions. + * + * @author mtaal + */ + +public class DalPerformanceCriteriaTest extends BaseTest { + + private static final int CNT = 1000; + + public void testPerformance() { + createManyBPs(); + + doTestCriteriaPerformance(new QueryTest1(false)); + doTestCriteriaPerformance(new QueryTest2(false)); + doTestCriteriaPerformance(new QueryTest3(false)); + doTestCriteriaPerformance(new QueryTest4(false)); + doTestCriteriaPerformance(new QueryTest5(false)); + doTestCriteriaPerformance(new QueryTest1(true)); + doTestCriteriaPerformance(new QueryTest2(true)); + doTestCriteriaPerformance(new QueryTest3(true)); + doTestCriteriaPerformance(new QueryTest4(true)); + doTestCriteriaPerformance(new QueryTest5(true)); + } + + public void doTestCriteriaPerformance(QueryTest queryTest) { + OBDal.getInstance().commitAndClose(); + + // usefull when printing + if (true) { + // warmup + queryTest.doCriteriaQry(); + // show sql + queryTest.doCriteriaQry(); + queryTest.doHqlQry(); + } + + // warmup + for (int i = 0; i < 10; i++) { + queryTest.doCriteriaQry(); + } + + long t1 = System.currentTimeMillis(); + int v1 = -1; + for (int i = 0; i < CNT; i++) { + int v2 = queryTest.doCriteriaQry(); + Assert.assertTrue(i == 0 || v1 == v2); + v1 = v2; + OBDal.getInstance().getSession().clear(); + } + OBDal.getInstance().commitAndClose(); + t1 = System.currentTimeMillis() - t1; + + // warmup + for (int i = 0; i < 10; i++) { + queryTest.doHqlQry(); + } + + long t2 = System.currentTimeMillis(); + for (int i = 0; i < CNT; i++) { + int v2 = queryTest.doHqlQry(); + // same output as previous criteria/hql queries + Assert.assertTrue(v1 == v2); + v1 = v2; + OBDal.getInstance().getSession().clear(); + } + OBDal.getInstance().commitAndClose(); + t2 = System.currentTimeMillis() - t2; + int percentage = (int) ((100 * (t1 - t2)) / t2); + System.err.println("HQL is " + percentage + "% faster - (resultCount: " + v1 + ") - " + + (queryTest.isDoScroll() ? "SCROLL - Query: " : "Query: ") + queryTest.getId() + + " - HQL time: " + t1 + "ms"); + } + + private abstract class QueryTest { + public abstract int doCriteriaQry(); + + public abstract int doHqlQry(); + + public abstract String getId(); + + public abstract boolean isDoScroll(); + + } + + public void testCriteriaScrollable() { + + OBCriteria<BusinessPartner> c = OBDal.getInstance().createCriteria(BusinessPartner.class); + ScrollableResults iterator = c.scroll(ScrollMode.FORWARD_ONLY); + iterator.next(); + } + + private class QueryTest1 extends QueryTest { + + private String qryStr = ""; + private boolean doScroll = false; + + public QueryTest1(boolean doScroll) { + this.doScroll = doScroll; + } + + public int doCriteriaQry() { + final OBCriteria<Currency> obc = OBDal.getInstance().createCriteria(Currency.class); + obc.add(Restrictions.eq(Currency.PROPERTY_ISOCODE, "USD")); + if (doScroll) { + final ScrollableResults r = obc.scroll(ScrollMode.FORWARD_ONLY); + int cnt = 0; + while (r.next()) { + cnt++; + } + return cnt; + } + final List<Currency> cs = obc.list(); + return cs.size(); + } + + public int doHqlQry() { + final OBQuery<Currency> obq = OBDal.getInstance() + .createQuery(Currency.class, "iSOCode='USD'"); + final List<Currency> cs = obq.list(); + qryStr = "Currency with " + obq.getWhereAndOrderBy(); + return cs.size(); + } + + public String getId() { + return qryStr; ------------------------------------------------------------------------------ Live Security Virtual Conference Exclusive live event will cover all the ways today's security and threat landscape has changed and how IT managers can respond. Discussions will include endpoint security, mobile security and the latest in malware threats. http://www.accelacomm.com/jaw/sfrnl04242012/114/50122263/ _______________________________________________ Openbravo-commits mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/openbravo-commits
