Ideas to bypass the sub-select query MAX for revisions?
varunmehta Jul 23, 2009 3:37 PMI changed the envers-console-demo to show the generated SQL and ran it again.
Initial Person data:
id = 1, name = James, surname = Bond, address = <1> MI6 18/25 id = 2, name = John, surname = McClane, address = <2> Nakatomi Plaza 10/34 id = 3, name = Holly, surname = Gennaro, address = <2> Nakatomi Plaza 10/34
So Mr. Bond is with MI6, I go ahead and edit the address 3 times.
Address History:
revision = 1, id = 1, streetName = MI6, houseNumber = 18, flatNumber = 25, persons = (<1> James Bond) (Thu Jul 23 15:13:22 EDT 2009) revision = 2, id = 1, streetName = 14th Street, houseNumber = 18, flatNumber = 25, persons = (<1> James Bond) (Thu Jul 23 15:14:41 EDT 2009) revision = 3, id = 1, streetName = 15th Street, houseNumber = 18, flatNumber = 25, persons = (<1> James Bond) (Thu Jul 23 15:14:50 EDT 2009) revision = 4, id = 1, streetName = 16th Street, houseNumber = 18, flatNumber = 25, persons = (<1> James Bond) (Thu Jul 23 15:15:05 EDT 2009)
List Persons:
id = 1, name = James, surname = Bond, address = <1> 16th Street 18/25 id = 2, name = John, surname = McClane, address = <2> Nakatomi Plaza 10/34 id = 3, name = Holly, surname = Gennaro, address = <2> Nakatomi Plaza 10/34
When I search for History of Mr. Bond, I get this; The address corresponding to Mr. Bond at that revision is still MI6.
revision = 1, id = 1, name = James, surname = Bond, address = <1> MI6 18/25 (Thu Jul 23 15:13:22 EDT 2009)
I make John stay at the same address as Mr. Bond
revision = 1, id = 1, streetName = MI6, houseNumber = 18, flatNumber = 25, persons = (<1> James Bond) (Thu Jul 23 15:13:22 EDT 2009) revision = 2, id = 1, streetName = 14th Street, houseNumber = 18, flatNumber = 25, persons = (<1> James Bond) (Thu Jul 23 15:14:41 EDT 2009) revision = 3, id = 1, streetName = 15th Street, houseNumber = 18, flatNumber = 25, persons = (<1> James Bond) (Thu Jul 23 15:14:50 EDT 2009) revision = 4, id = 1, streetName = 16th Street, houseNumber = 18, flatNumber = 25, persons = (<1> James Bond) (Thu Jul 23 15:15:05 EDT 2009) revision = 6, id = 1, streetName = 16th Street, houseNumber = 18, flatNumber = 25, persons = (<2> John McClane, <1> Thames Bond) (Thu Jul 23 15:30:26 EDT 2009)
Went ahead and searched for the Address at that revision, for which I provide the following info;
----------------------------------------------- 1 - list persons 5 - list addresses 2 - list person history 6 - list addresses history 3 - new person 7 - new address 4 - modify person 8 - modify address 9 - get person at revision 10 - get address at revision 0 - end 10 Address id: 1 Revision number: 4 id = 1, streetName = 16th Street, houseNumber = 18, flatNumber = 25, persons = (<1> James Bond)
and I get this SQL generated.
Hibernate: -----------> {A} select address_ve0_.id as id3_, address_ve0_._revision as column2_3_, address_ve0_._revision_type as column3_3_, address_ve0_.flatNumber as flatNumber3_, address_ve0_.houseNumber as houseNum5_3_, address_ve0_.streetName as streetName3_ from Address_versions address_ve0_ where address_ve0_._revision_type<>? and ( address_ve0_._revision in ( select max(address_ve1_._revision) from Address_versions address_ve1_ where address_ve1_._revision<=? and address_ve0_.id=address_ve1_.id ) ) and address_ve0_.id=? Hibernate: -----------> {B} select person_ver0_.id as col_0_0_, person_ver0_._revision as col_0_1_ from Person_versions person_ver0_ where person_ver0_.address_id=? and ( person_ver0_._revision in ( select max(person_ver1_._revision) from Person_versions person_ver1_ where person_ver1_._revision<=? and person_ver0_.id=person_ver1_.id ) ) and person_ver0_._revision_type<>?
I can understand the {B} part of the code, where we need to find the Person using the address at that version, but for {A}, since we know the "exact" version of the address, can we avoid the subselect
and ( address_ve0_._revision in ( select max(address_ve1_._revision) from Address_versions address_ve1_ where address_ve1_._revision<=? and address_ve0_.id=address_ve1_.id )
Will be a nice performance improvement.