On Thu, Jan 28, 2010 at 1:21 PM, Miłosz Tylenda <[email protected]> wrote:
> Hi Kevin, > > The failure depends on the order of tests being executed and this is > probably why my previous test run did not fail at these two. > > Most likely there is nothing unique in PostgreSQL's date handling, maybe it > is just more sensitive to differences between date/time column variants. > Dates should be mapped to DATE and timestamps to ABSTIME, at least our > dictionary specifies them such. What's unfortunate in our tests is that we > have multiple entities which map to tables with same names but different > columns, RuntimeTest1 in this case. Probably most of us have been struggling > with that inconvenience already. > > RuntimeTest1 in two tests in question is defined as you described. This > results in mapping to DATE column. Some other RuntimeTest1 omit the > annotation which forces mapping to ABSTIME column. Maybe this should also > map to DATE but I found nothing specific to PostgreSQL here. Anyway, our > mapping mechanism is not perfect with such subtle changes to table > definitions and hence errors. > > Maybe some of the test should drop/create their tables but the only > reliable solution is that we don't create tables with same names but > different columns. Unless we want to test the mapping tool :) > +1. Cleaning this up (removing duplicate mappings) would be a good thing and might speed up the test bucket a bit. I remember seeing a lot of time consuming ALTER TABLE statements with DB2 (haven't looked recently though). -mike > Cheers, > Milosz > > > > Hi Milosz, > > It seems that PostgreSQL is having problems with TemporalType.DATE > fields. > > The two tests below are failing because the RuntimeTest1 entity > definition > > can't be persisted to the database. The field it's complaining about is > > below... > > > > @Temporal(TemporalType.DATE) > > private Date dateField; > > > > Any uniqueness with Date fields in PostgreSQL? > > > > Kevin > > > > On Sat, Jan 23, 2010 at 7:31 AM, Miłosz Tylenda <[email protected]> wrote: > > > > > Hi All. > > > > > > I re-ran the tests on PostgreSQL and the auto-increment failures > vanished. > > > > > > What's new, it is something related to cache or date handling - I > observed > > > two new failures. Stack traces below. > > > > > > Regards, > > > Milosz > > > > > > > > > > testQueryImplicitEvictions(org.apache.openjpa.persistence.datacache.TestSJVMCache) > > > > > > > testQueryImplicitEvictions(org.apache.openjpa.persistence.datacache.TestDataCachePCDataGenerator) > > > > > > > > > Tests run: 30, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 57.511 > sec > > > <<< FAILURE! > > > > testQueryImplicitEvictions(org.apache.openjpa.persistence.datacache.TestSJVMCache) > > > Time elapsed: 1.441 sec <<< ERROR! > > > <openjpa-2.0.0-SNAPSHOT-rsvn: This client is too old to work with > working > > > copy '/alt/eclipse322/workspace/open-jpa/openjpa-lib/..'; please get a > newer > > > Subversion client fatal store error> > > > org.apache.openjpa.persistence.RollbackExc > > > eption: The transaction has been rolled back. See the nested > exceptions > > > for details on the errors that occurred. > > > at > > > > org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:568) > > > at > > > > org.apache.openjpa.persistence.common.utils.AbstractTestCase.endTx(AbstractTestCase.java:278) > > > at > > > > org.apache.openjpa.persistence.datacache.CacheTest.testQueryImplicitEvictions(CacheTest.java:1135) > > > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > > > at > > > > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) > > > at > > > > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) > > > at java.lang.reflect.Method.invoke(Method.java:597) > > > at junit.framework.TestCase.runTest(TestCase.java:154) > > > at > > > > org.apache.openjpa.persistence.test.AbstractPersistenceTestCase.runTest(AbstractPersistenceTestCase.java:514) > > > at junit.framework.TestCase.runBare(TestCase.java:127) > > > at > > > > org.apache.openjpa.persistence.test.AbstractPersistenceTestCase.runBare(AbstractPersistenceTestCase.java:501) > > > at > > > > org.apache.openjpa.persistence.test.AbstractPersistenceTestCase.runBare(AbstractPersistenceTestCase.java:477) > > > at junit.framework.TestResult$1.protect(TestResult.java:106) > > > at junit.framework.TestResult.runProtected(TestResult.java:124) > > > at junit.framework.TestResult.run(TestResult.java:109) > > > at junit.framework.TestCase.run(TestCase.java:118) > > > at > > > > org.apache.openjpa.persistence.test.AbstractPersistenceTestCase.run(AbstractPersistenceTestCase.java:177) > > > at junit.framework.TestSuite.runTest(TestSuite.java:208) > > > at junit.framework.TestSuite.run(TestSuite.java:203) > > > at sun.reflect.GeneratedMethodAccessor54.invoke(Unknown Source) > > > at > > > > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) > > > at java.lang.reflect.Method.invoke(Method.java:597) > > > at > > > > org.apache.maven.surefire.junit.JUnitTestSet.execute(JUnitTestSet.java:213) > > > at > > > > org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:140) > > > at > > > > org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:127) > > > at org.apache.maven.surefire.Surefire.run(Surefire.java:177) > > > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > > > at > > > > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) > > > at > > > > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) > > > at java.lang.reflect.Method.invoke(Method.java:597) > > > at > > > > org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:345) > > > at > > > > org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:1009) > > > Caused by: <openjpa-2.0.0-SNAPSHOT-rsvn: This client is too old to work > > > with working copy '/alt/eclipse322/workspace/open-jpa/openjpa-lib/..'; > > > please get a newer Subversion client fatal general error> > > > org.apache.openjpa.persistenc > > > e.PersistenceException: The transaction has been rolled back. See the > > > nested exceptions for details on the errors that occurred. > > > at > > > > org.apache.openjpa.kernel.BrokerImpl.newFlushException(BrokerImpl.java:2273) > > > at > org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:2115) > > > at > > > org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:2013) > > > at > > > > org.apache.openjpa.kernel.BrokerImpl.beforeCompletion(BrokerImpl.java:1931) > > > at > > > > org.apache.openjpa.kernel.LocalManagedRuntime.commit(LocalManagedRuntime.java:81) > > > at > org.apache.openjpa.kernel.BrokerImpl.commit(BrokerImpl.java:1455) > > > at > > > > org.apache.openjpa.kernel.DelegatingBroker.commit(DelegatingBroker.java:903) > > > at > > > > org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:551) > > > ... 31 more > > > Caused by: <openjpa-2.0.0-SNAPSHOT-rsvn: This client is too old to work > > > with working copy '/alt/eclipse322/workspace/open-jpa/openjpa-lib/..'; > > > please get a newer Subversion client nonfatal general error> > > > org.apache.openjpa.persist > > > ence.PersistenceException: ERROR: column "datefield" is of type abstime > but > > > expression is of type date > > > Hint: You will need to rewrite or cast the expression. > > > Position: 146 {prepstmnt 33138943 INSERT INTO RuntimeTest1 (id, > > > bigDecimalField, bigIntegerField, booleanField, booleanObjField, > byteField, > > > byteObjfield, charField, charObjField, dateField, doubleField, > > > doubleObjField, floatFiel > > > d, floatObjField, intField, intObjField, localeField, longField, > > > longObjField, shortField, shortObjField, stringField, transString, > DTYPE, > > > SELFONEONE_ID, TRANSFIELD_ID) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, > ?, ?, > > > ?, ?, ?, ?, ?, > > > ?, ?, ?, ?, ?, ?, ?, ?) [params=(long) 51, (null) null, (null) null, > > > (boolean) false, (null) null, (byte) 0, (null) null, (int) 0, (null) > null, > > > (null) null, (double) 0.0, (null) null, (float) 0.0, (null) null, (int) > 0, > > > (null) nul > > > l, (null) null, (long) 0, (null) null, (short) 0, (null) null, (null) > null, > > > (null) null, (String) dataRt1, (null) null, (null) null]} [code=0, > > > state=42804] > > > FailedObject: > > > > org.apache.openjpa.persistence.datacache.common.apps.runtimete...@9da711 > > > at > > > org.apache.openjpa.jdbc.sql.DBDictionary.narrow(DBDictionary.java:4831) > > > at > > > > org.apache.openjpa.jdbc.sql.DBDictionary.newStoreException(DBDictionary.java:4784) > > > at > > > > org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:137) > > > at > > > > org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:78) > > > at > > > > org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flushAndUpdate(PreparedStatementManagerImpl.java:143) > > > at > > > > org.apache.openjpa.jdbc.kernel.BatchingPreparedStatementManagerImpl.flushAndUpdate(BatchingPreparedStatementManagerImpl.java:80) > > > at > > > > org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flushInternal(PreparedStatementManagerImpl.java:99) > > > at > > > > org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flush(PreparedStatementManagerImpl.java:87) > > > at > > > > org.apache.openjpa.jdbc.kernel.ConstraintUpdateManager.flush(ConstraintUpdateManager.java:550) > > > at > > > > org.apache.openjpa.jdbc.kernel.ConstraintUpdateManager.flush(ConstraintUpdateManager.java:106) > > > at > > > > org.apache.openjpa.jdbc.kernel.BatchingConstraintUpdateManager.flush(BatchingConstraintUpdateManager.java:59) > > > at > > > > org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:103) > > > at > > > > org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:76) > > > at > > > > org.apache.openjpa.jdbc.kernel.JDBCStoreManager.flush(JDBCStoreManager.java:680) > > > at > > > > org.apache.openjpa.kernel.DelegatingStoreManager.flush(DelegatingStoreManager.java:130) > > > at > > > > org.apache.openjpa.datacache.DataCacheStoreManager.flush(DataCacheStoreManager.java:540) > > > at > > > > org.apache.openjpa.kernel.DelegatingStoreManager.flush(DelegatingStoreManager.java:130) > > > ... 38 more > > > > > > > > > Tests run: 30, Failures: 0, Errors: 1, Skipped: 0, Time elapsed: 58.9 > sec > > > <<< FAILURE! > > > > testQueryImplicitEvictions(org.apache.openjpa.persistence.datacache.TestDataCachePCDataGenerator) > > > Time elapsed: 1.739 sec <<< ERROR! > > > <openjpa-2.0.0-SNAPSHOT-rsvn: This client is too old to work with > working > > > copy '/alt/eclipse322/workspace/open-jpa/openjpa-lib/..'; please get a > newer > > > Subversion client fatal store error> > > > org.apache.openjpa.persistence.RollbackExc > > > eption: The transaction has been rolled back. See the nested > exceptions > > > for details on the errors that occurred. > > > at > > > > org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:568) > > > at > > > > org.apache.openjpa.persistence.common.utils.AbstractTestCase.endTx(AbstractTestCase.java:278) > > > at > > > > org.apache.openjpa.persistence.datacache.CacheTest.testQueryImplicitEvictions(CacheTest.java:1135) > > > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > > > at > > > > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) > > > at > > > > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) > > > at java.lang.reflect.Method.invoke(Method.java:597) > > > at junit.framework.TestCase.runTest(TestCase.java:154) > > > at > > > > org.apache.openjpa.persistence.test.AbstractPersistenceTestCase.runTest(AbstractPersistenceTestCase.java:514) > > > at junit.framework.TestCase.runBare(TestCase.java:127) > > > at > > > > org.apache.openjpa.persistence.test.AbstractPersistenceTestCase.runBare(AbstractPersistenceTestCase.java:501) > > > at > > > > org.apache.openjpa.persistence.test.AbstractPersistenceTestCase.runBare(AbstractPersistenceTestCase.java:477) > > > at junit.framework.TestResult$1.protect(TestResult.java:106) > > > at junit.framework.TestResult.runProtected(TestResult.java:124) > > > at junit.framework.TestResult.run(TestResult.java:109) > > > at junit.framework.TestCase.run(TestCase.java:118) > > > at > > > > org.apache.openjpa.persistence.test.AbstractPersistenceTestCase.run(AbstractPersistenceTestCase.java:177) > > > at junit.framework.TestSuite.runTest(TestSuite.java:208) > > > at junit.framework.TestSuite.run(TestSuite.java:203) > > > at sun.reflect.GeneratedMethodAccessor54.invoke(Unknown Source) > > > at > > > > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) > > > at java.lang.reflect.Method.invoke(Method.java:597) > > > at > > > > org.apache.maven.surefire.junit.JUnitTestSet.execute(JUnitTestSet.java:213) > > > at > > > > org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.executeTestSet(AbstractDirectoryTestSuite.java:140) > > > at > > > > org.apache.maven.surefire.suite.AbstractDirectoryTestSuite.execute(AbstractDirectoryTestSuite.java:127) > > > at org.apache.maven.surefire.Surefire.run(Surefire.java:177) > > > at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) > > > at > > > > sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) > > > at > > > > sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) > > > at java.lang.reflect.Method.invoke(Method.java:597) > > > at > > > > org.apache.maven.surefire.booter.SurefireBooter.runSuitesInProcess(SurefireBooter.java:345) > > > at > > > > org.apache.maven.surefire.booter.SurefireBooter.main(SurefireBooter.java:1009) > > > Caused by: <openjpa-2.0.0-SNAPSHOT-rsvn: This client is too old to work > > > with working copy '/alt/eclipse322/workspace/open-jpa/openjpa-lib/..'; > > > please get a newer Subversion client fatal general error> > > > org.apache.openjpa.persistenc > > > e.PersistenceException: The transaction has been rolled back. See the > > > nested exceptions for details on the errors that occurred. > > > at > > > > org.apache.openjpa.kernel.BrokerImpl.newFlushException(BrokerImpl.java:2273) > > > at > org.apache.openjpa.kernel.BrokerImpl.flush(BrokerImpl.java:2115) > > > at > > > org.apache.openjpa.kernel.BrokerImpl.flushSafe(BrokerImpl.java:2013) > > > at > > > > org.apache.openjpa.kernel.BrokerImpl.beforeCompletion(BrokerImpl.java:1931) > > > at > > > > org.apache.openjpa.kernel.LocalManagedRuntime.commit(LocalManagedRuntime.java:81) > > > at > org.apache.openjpa.kernel.BrokerImpl.commit(BrokerImpl.java:1455) > > > at > > > > org.apache.openjpa.kernel.DelegatingBroker.commit(DelegatingBroker.java:903) > > > at > > > > org.apache.openjpa.persistence.EntityManagerImpl.commit(EntityManagerImpl.java:551) > > > ... 31 more > > > Caused by: <openjpa-2.0.0-SNAPSHOT-rsvn: This client is too old to work > > > with working copy '/alt/eclipse322/workspace/open-jpa/openjpa-lib/..'; > > > please get a newer Subversion client nonfatal general error> > > > org.apache.openjpa.persist > > > ence.PersistenceException: ERROR: column "datefield" is of type abstime > but > > > expression is of type date > > > Hint: You will need to rewrite or cast the expression. > > > Position: 146 {prepstmnt 7445208 INSERT INTO RuntimeTest1 (id, > > > bigDecimalField, bigIntegerField, booleanField, booleanObjField, > byteField, > > > byteObjfield, charField, charObjField, dateField, doubleField, > > > doubleObjField, floatField > > > , floatObjField, intField, intObjField, localeField, longField, > > > longObjField, shortField, shortObjField, stringField, transString, > DTYPE, > > > SELFONEONE_ID, TRANSFIELD_ID) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, > ?, ?, > > > ?, ?, ?, ?, ?, > > > ?, ?, ?, ?, ?, ?, ?, ?) [params=(long) 51, (null) null, (null) null, > > > (boolean) false, (null) null, (byte) 0, (null) null, (int) 0, (null) > null, > > > (null) null, (double) 0.0, (null) null, (float) 0.0, (null) null, (int) > 0, > > > (null) null > > > , (null) null, (long) 0, (null) null, (short) 0, (null) null, (null) > null, > > > (null) null, (String) dataRt1, (null) null, (null) null]} [code=0, > > > state=42804] > > > FailedObject: > > > > org.apache.openjpa.persistence.datacache.common.apps.runtimete...@768bd0 > > > at > > > org.apache.openjpa.jdbc.sql.DBDictionary.narrow(DBDictionary.java:4831) > > > at > > > > org.apache.openjpa.jdbc.sql.DBDictionary.newStoreException(DBDictionary.java:4784) > > > at > > > > org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:137) > > > at > > > > org.apache.openjpa.jdbc.sql.SQLExceptions.getStore(SQLExceptions.java:78) > > > at > > > > org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flushAndUpdate(PreparedStatementManagerImpl.java:143) > > > at > > > > org.apache.openjpa.jdbc.kernel.BatchingPreparedStatementManagerImpl.flushAndUpdate(BatchingPreparedStatementManagerImpl.java:80) > > > at > > > > org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flushInternal(PreparedStatementManagerImpl.java:99) > > > at > > > > org.apache.openjpa.jdbc.kernel.PreparedStatementManagerImpl.flush(PreparedStatementManagerImpl.java:87) > > > at > > > > org.apache.openjpa.jdbc.kernel.ConstraintUpdateManager.flush(ConstraintUpdateManager.java:550) > > > at > > > > org.apache.openjpa.jdbc.kernel.ConstraintUpdateManager.flush(ConstraintUpdateManager.java:106) > > > at > > > > org.apache.openjpa.jdbc.kernel.BatchingConstraintUpdateManager.flush(BatchingConstraintUpdateManager.java:59) > > > at > > > > org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:103) > > > at > > > > org.apache.openjpa.jdbc.kernel.AbstractUpdateManager.flush(AbstractUpdateManager.java:76) > > > at > > > > org.apache.openjpa.jdbc.kernel.JDBCStoreManager.flush(JDBCStoreManager.java:680) > > > at > > > > org.apache.openjpa.kernel.DelegatingStoreManager.flush(DelegatingStoreManager.java:130) > > > at > > > > org.apache.openjpa.datacache.DataCacheStoreManager.flush(DataCacheStoreManager.java:540) > > > at > > > > org.apache.openjpa.kernel.DelegatingStoreManager.flush(DelegatingStoreManager.java:130) > > > ... 38 more > > > > > > > > > > > > > > > > Milosz, > > > > > > > > Thanks again for running the jUnits on PostgreSQL. It uncovered a > nasty > > > pest, particularly unfriendly to PostgreSQL. The problem is fixed and > the > > > changes are in trunk. rev. 902177. > > > > > > > > -Jeremy > > > > > > > > > > > > On Tue, Jan 19, 2010 at 3:22 PM, Miłosz Tylenda <[email protected]> > wrote: > > > > > > > > Hi All, > > > > > > > > Recently the test suite on PostgreSQL got a few new failures related > to > > > auto-increment columns, probably after introducing delimiter support. I > have > > > communicated the details to Jeremy. > > > > > > > > Also, OPENJPA-1289 seems to be resolved. > > > > > > > > Regards, > > > > Milosz > > > > > > > > > > > > > > > > > I'd also like to see OPENJPA-1410 make it into the release. This > bug > > > > > prevents OpenJPA 2.0 from running in some environments. Donald and > I > > > have > > > > > been looking into the problem and it is tagged as critical. > > > > > > > > > > -Jeremy > > > > > > > > > > On Tue, Jan 19, 2010 at 11:44 AM, Michael Dick < > > > [email protected]>wrote: > > > > > > > > > > > There's also the issue of WriteBehind support (OPENJPA-1150). > This > > > work > > > > > > never got to the point where I'd be really comfortable including > it > > > in > > > > > > 2.0.0. 2.1.0 would be a better target though and I'm inclined to > back > > > out > > > > > > the code for the upcoming release. > > > > > > > > > > > > -mike > > > > > > > > > > > > > > > > > > On Tue, Jan 19, 2010 at 11:15 AM, Kevin Sutter < > [email protected]> > > > wrote: > > > > > > > > > > > > > Hi Donald, > > > > > > > I'd like to get the default settings for the DataCache figured > out > > > before > > > > > > > we > > > > > > > cut a 2.0 release [1]. We've been running with this turned > "on" > > > for our > > > > > > > performance benchmarks, so why not have this as our default? > I'm > > > running > > > > > > > our JUnit bucket as we speak... > > > > > > > > > > > > > > Thanks, > > > > > > > Kevin > > > > > > > > > > > > > > [1] https://issues.apache.org/jira/browse/OPENJPA-1469 > > > > > > > > > > > > > > On Mon, Jan 18, 2010 at 9:57 PM, Donald Woods < > [email protected]> > > > wrote: > > > > > > > > > > > > > > > We're in pretty good shape for a 2.0.0 release. > > > > > > > > Trunk is passing the JPA 2.0 TCK. > > > > > > > > We have the broadest/best junit results over Derby, DB2, > Oracle, > > > MySQL > > > > > > > > and MS SQL as we have for any release. > > > > > > > > > > > > > > > > Now, we could either release a Milestone 4 release and > continue > > > to work > > > > > > > > on docs, samples, performance and the backlog issues or we > could > > > go > > > > > > > > ahead and plan on cutting a 2.0.0 branch later this week with > > > plans to > > > > > > > > continue improving the 2.0 codebase in maintenance releases > at > > > least > > > > > > > > every quarter. > > > > > > > > > > > > > > > > If you have any critical issues that you feel need to be > resolved > > > > > > before > > > > > > > > we release 2.0.0, please update the JIRA Fix Version to 2.0.0 > and > > > set > > > > > > > > the Priority, along with replying to this discussion thread > with > > > the > > > > > > > > details of the issues you would like considered. After a > couple > > > days > > > > > > of > > > > > > > > discussions, we'll revisit the open issues and decide on > which > > > route to > > > > > > > > take. > > > > > > > > > > > > > > > > > > > > > > > > Thanks, > > > > > > > > Donald > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > >
