From 482c0c75a53ecb21325adde950438f879baf0e50 Mon Sep 17 00:00:00 2001 From: "Brian S. O'Neill" Date: Tue, 31 Oct 2006 06:47:36 +0000 Subject: Index records no longer use join property to link to master and instead copy key property values. This allows IndexedRepository to properly load master records from the master storage. --- .../carbonado/repo/indexed/IndexEntryAccessor.java | 11 +++++---- .../repo/indexed/IndexEntryGenerator.java | 15 ++++++------ .../carbonado/repo/indexed/IndexedCursor.java | 27 ++++++++++++---------- .../carbonado/repo/indexed/ManagedIndex.java | 14 +++++------ 4 files changed, 36 insertions(+), 31 deletions(-) (limited to 'src/main/java/com/amazon/carbonado/repo/indexed') diff --git a/src/main/java/com/amazon/carbonado/repo/indexed/IndexEntryAccessor.java b/src/main/java/com/amazon/carbonado/repo/indexed/IndexEntryAccessor.java index 16a980d..b107a6e 100644 --- a/src/main/java/com/amazon/carbonado/repo/indexed/IndexEntryAccessor.java +++ b/src/main/java/com/amazon/carbonado/repo/indexed/IndexEntryAccessor.java @@ -40,12 +40,13 @@ public interface IndexEntryAccessor extends IndexInfo { Storage getIndexEntryStorage(); /** - * Loads the master object referenced by the given index entry. + * Sets all the primary key properties of the given master, using the + * applicable properties of the given index entry. * - * @param indexEntry index entry which points to master - * @return master or null if missing + * @param indexEntry source of property values + * @param master master whose primary key properties will be set */ - S loadMaster(Storable indexEntry) throws FetchException; + void copyToMasterPrimaryKey(Storable indexEntry, S master); /** * Sets all the properties of the given index entry, using the applicable @@ -54,7 +55,7 @@ public interface IndexEntryAccessor extends IndexInfo { * @param indexEntry index entry whose properties will be set * @param master source of property values */ - void setAllProperties(Storable indexEntry, S master); + void copyFromMaster(Storable indexEntry, S master); /** * Returns true if the properties of the given index entry match those diff --git a/src/main/java/com/amazon/carbonado/repo/indexed/IndexEntryGenerator.java b/src/main/java/com/amazon/carbonado/repo/indexed/IndexEntryGenerator.java index 3da1a5b..4059ac3 100644 --- a/src/main/java/com/amazon/carbonado/repo/indexed/IndexEntryGenerator.java +++ b/src/main/java/com/amazon/carbonado/repo/indexed/IndexEntryGenerator.java @@ -132,13 +132,14 @@ class IndexEntryGenerator { } /** - * Loads the master object referenced by the given index entry. + * Sets all the primary key properties of the given master, using the + * applicable properties of the given index entry. * - * @param indexEntry index entry which points to master - * @return master or null if missing + * @param indexEntry source of property values + * @param master master whose primary key properties will be set */ - public S loadMaster(Storable ref) throws FetchException { - return mBuilder.loadMaster(ref); + public void copyToMasterPrimaryKey(Storable indexEntry, S master) { + mBuilder.copyToMasterPrimaryKey(indexEntry, master); } /** @@ -148,8 +149,8 @@ class IndexEntryGenerator { * @param indexEntry index entry whose properties will be set * @param master source of property values */ - public void setAllProperties(Storable indexEntry, S master) { - mBuilder.setAllProperties(indexEntry, master); + public void copyFromMaster(Storable indexEntry, S master) { + mBuilder.copyFromMaster(indexEntry, master); } /** diff --git a/src/main/java/com/amazon/carbonado/repo/indexed/IndexedCursor.java b/src/main/java/com/amazon/carbonado/repo/indexed/IndexedCursor.java index 3a50a84..892af49 100644 --- a/src/main/java/com/amazon/carbonado/repo/indexed/IndexedCursor.java +++ b/src/main/java/com/amazon/carbonado/repo/indexed/IndexedCursor.java @@ -65,8 +65,11 @@ class IndexedCursor extends AbstractCursor { } while (mCursor.hasNext()) { final Storable indexEntry = mCursor.next(); - S master = mGenerator.loadMaster(indexEntry); - if (master == null) { + + S master = mStorage.mMasterStorage.prepare(); + mGenerator.copyToMasterPrimaryKey(indexEntry, master); + + if (!master.tryLoad()) { LogFactory.getLog(getClass()).warn ("Master is missing for index entry: " + indexEntry); } else { @@ -83,7 +86,7 @@ class IndexedCursor extends AbstractCursor { final Storage indexEntryStorage = repo.getIndexEntryStorageFor(mGenerator.getIndexEntryClass()); Storable newIndexEntry = indexEntryStorage.prepare(); - mGenerator.setAllProperties(newIndexEntry, master); + mGenerator.copyFromMaster(newIndexEntry, master); if (newIndexEntry.tryLoad()) { // Good, the correct index entry exists. We'll see @@ -103,18 +106,18 @@ class IndexedCursor extends AbstractCursor { Transaction txn = repo.enterTransaction(); try { // Reload master and verify inconsistency. - S master = mGenerator.loadMaster(indexEntry); - if (mGenerator.isConsistent(indexEntry, master)) { - return; - } + S master = mStorage.mMasterStorage.prepare(); + mGenerator.copyToMasterPrimaryKey(indexEntry, master); - Storable newIndexEntry = indexEntryStorage.prepare(); - mGenerator.setAllProperties(newIndexEntry, master); + if (master.tryLoad()) { + Storable newIndexEntry = indexEntryStorage.prepare(); + mGenerator.copyFromMaster(newIndexEntry, master); - newIndexEntry.tryInsert(); + newIndexEntry.tryInsert(); - indexEntry.tryDelete(); - txn.commit(); + indexEntry.tryDelete(); + txn.commit(); + } } catch (FetchException fe) { LogFactory.getLog(IndexedCursor.class).warn ("Unable to check if repair required for " + diff --git a/src/main/java/com/amazon/carbonado/repo/indexed/ManagedIndex.java b/src/main/java/com/amazon/carbonado/repo/indexed/ManagedIndex.java index cfc399b..80ad172 100644 --- a/src/main/java/com/amazon/carbonado/repo/indexed/ManagedIndex.java +++ b/src/main/java/com/amazon/carbonado/repo/indexed/ManagedIndex.java @@ -126,13 +126,13 @@ class ManagedIndex implements IndexEntryAccessor { } // Required by IndexEntryAccessor interface. - public S loadMaster(Storable indexEntry) throws FetchException { - return mGenerator.loadMaster(indexEntry); + public void copyToMasterPrimaryKey(Storable indexEntry, S master) { + mGenerator.copyToMasterPrimaryKey(indexEntry, master); } // Required by IndexEntryAccessor interface. - public void setAllProperties(Storable indexEntry, S master) { - mGenerator.setAllProperties(indexEntry, master); + public void copyFromMaster(Storable indexEntry, S master) { + mGenerator.copyFromMaster(indexEntry, master); } // Required by IndexEntryAccessor interface. @@ -388,7 +388,7 @@ class ManagedIndex implements IndexEntryAccessor { private Storable makeIndexEntry(S userStorable) { Storable indexEntry = mIndexEntryStorage.prepare(); - mGenerator.setAllProperties(indexEntry, userStorable); + mGenerator.copyFromMaster(indexEntry, userStorable); return indexEntry; } @@ -403,7 +403,7 @@ class ManagedIndex implements IndexEntryAccessor { // If index entry already exists, then index might be corrupt. { Storable freshEntry = mIndexEntryStorage.prepare(); - mGenerator.setAllProperties(freshEntry, userStorable); + mGenerator.copyFromMaster(freshEntry, userStorable); indexEntry.copyVersionProperty(freshEntry); if (freshEntry.equals(indexEntry)) { // Existing entry is exactly what we expect. Return false @@ -433,7 +433,7 @@ class ManagedIndex implements IndexEntryAccessor { } Storable freshEntry = mIndexEntryStorage.prepare(); - mGenerator.setAllProperties(freshEntry, freshUserStorable); + mGenerator.copyFromMaster(freshEntry, freshUserStorable); // Blow it away entry and re-insert. Don't simply update // the entry, since record version number may prevent -- cgit v1.2.3