From e386d6c3a0854340a8c95d9da065a7fbbb3444bb Mon Sep 17 00:00:00 2001 From: Par Winzell Date: Tue, 7 Aug 2007 18:05:44 +0000 Subject: [PATCH] Add an index, document index use for Depot operations. Do you think this is worthwhile? We should really just about never see a non-indexed query during normal production use and one way to maintain that discipline is with a comment line like this. git-svn-id: svn+ssh://src.earth.threerings.net/vilya/trunk@399 c613c5cb-e716-0410-b11b-feb51c14d237 --- .../server/persist/GameCookieRepository.java | 3 +++ .../rating/server/persist/RatingRecord.java | 17 ++++++++++------- .../rating/server/persist/RatingRepository.java | 11 +++++++---- .../stats/server/persist/StatRecord.java | 2 +- .../stats/server/persist/StatRepository.java | 6 ++++++ 5 files changed, 27 insertions(+), 12 deletions(-) diff --git a/src/java/com/threerings/ezgame/server/persist/GameCookieRepository.java b/src/java/com/threerings/ezgame/server/persist/GameCookieRepository.java index 5a012a11..9036a7de 100644 --- a/src/java/com/threerings/ezgame/server/persist/GameCookieRepository.java +++ b/src/java/com/threerings/ezgame/server/persist/GameCookieRepository.java @@ -45,6 +45,7 @@ public class GameCookieRepository extends DepotRepository public byte[] getCookie (int gameId, int userId) throws PersistenceException { + // INDEX: Primary key. GameCookieRecord record = load( GameCookieRecord.class, GameCookieRecord.getKey(gameId, userId)); return record != null ? record.cookie : null; @@ -58,8 +59,10 @@ public class GameCookieRepository extends DepotRepository throws PersistenceException { if (cookie != null) { + // INDEX: Primary key. store(new GameCookieRecord(gameId, userId, cookie)); } else { + // INDEX: Primary key. delete(GameCookieRecord.class, GameCookieRecord.getKey(gameId, userId)); } } diff --git a/src/java/com/threerings/parlor/rating/server/persist/RatingRecord.java b/src/java/com/threerings/parlor/rating/server/persist/RatingRecord.java index ae1c6686..2d4a94c9 100644 --- a/src/java/com/threerings/parlor/rating/server/persist/RatingRecord.java +++ b/src/java/com/threerings/parlor/rating/server/persist/RatingRecord.java @@ -25,9 +25,12 @@ import com.samskivert.jdbc.depot.Key; import com.samskivert.jdbc.depot.PersistentRecord; import com.samskivert.jdbc.depot.annotation.Entity; import com.samskivert.jdbc.depot.annotation.Id; +import com.samskivert.jdbc.depot.annotation.Index; import com.samskivert.jdbc.depot.expression.ColumnExp; -@Entity +@Entity(indices={ + @Index(name="ixPlayerId", columns={ RatingRecord.PLAYER_ID }) +}) public class RatingRecord extends PersistentRecord { // AUTO-GENERATED: FIELDS START @@ -60,19 +63,19 @@ public class RatingRecord extends PersistentRecord new ColumnExp(RatingRecord.class, EXPERIENCE); // AUTO-GENERATED: FIELDS END - public static final int SCHEMA_VERSION = 1; + public static final int SCHEMA_VERSION = 2; /** The identifier of the game we're rating for. */ @Id public int gameId; - /** The identifier of the player we're rating. */ + /** The identifier of the player we're rating. */ @Id public int playerId; - + /** The player's current rating. */ public int rating; - + /** The number of times the player has played this game. */ public int experience; @@ -83,14 +86,14 @@ public class RatingRecord extends PersistentRecord { super(); } - + /** * A constructor that populates all our fields. */ public RatingRecord (int gameId, int playerId, int rating, int experience) { super(); - + this.gameId = gameId; this.playerId = playerId; this.rating = rating; diff --git a/src/java/com/threerings/parlor/rating/server/persist/RatingRepository.java b/src/java/com/threerings/parlor/rating/server/persist/RatingRepository.java index ac7835c7..91d9efe5 100644 --- a/src/java/com/threerings/parlor/rating/server/persist/RatingRepository.java +++ b/src/java/com/threerings/parlor/rating/server/persist/RatingRepository.java @@ -54,15 +54,16 @@ public class RatingRepository extends DepotRepository public RatingRecord getRating (int gameId, int playerId) throws PersistenceException { - return load(RatingRecord.class, - RatingRecord.GAME_ID, gameId, - RatingRecord.PLAYER_ID, playerId); + // INDEX: Full primary key. + return load(RatingRecord.class, RatingRecord.getKey(gameId, playerId)); } /** * Fetch the ratings registered for any of the given players for the given game and return * them as a list of {@link RatingRecord} objects. The size of this list is no less than zero * and no greater than the number of given players. + * + * INDEXING: Uses primary key. */ public List getRatings (int gameId, Integer... players) throws PersistenceException @@ -70,17 +71,19 @@ public class RatingRepository extends DepotRepository if (players.length == 0) { return Collections.emptyList(); } + // INDEX: Full primary key. return findAll(RatingRecord.class, new Where(new And(new Equals(RatingRecord.GAME_ID_C, gameId), new In(RatingRecord.PLAYER_ID_C, players)))); } /** - * Fetch and return all the registered {@link RatingRecord} rows for the given player. + * Fetch and return all the registered {@link RatingRecord} rows for the given player. */ public List getRatings (int playerId) throws PersistenceException { + // INDEX: ixPlayerId return findAll(RatingRecord.class, new Where(RatingRecord.PLAYER_ID_C, playerId)); } diff --git a/src/java/com/threerings/stats/server/persist/StatRecord.java b/src/java/com/threerings/stats/server/persist/StatRecord.java index eb7cddf0..3c23b76a 100644 --- a/src/java/com/threerings/stats/server/persist/StatRecord.java +++ b/src/java/com/threerings/stats/server/persist/StatRecord.java @@ -65,7 +65,7 @@ public class StatRecord extends PersistentRecord @Id @Column(name="STAT_CODE") public int statCode; - + /** The data associated with the stat. */ @Column(name="STAT_DATA", length=65535) public byte[] statData; diff --git a/src/java/com/threerings/stats/server/persist/StatRepository.java b/src/java/com/threerings/stats/server/persist/StatRepository.java index b681cbe7..c7da7d5e 100644 --- a/src/java/com/threerings/stats/server/persist/StatRepository.java +++ b/src/java/com/threerings/stats/server/persist/StatRepository.java @@ -55,11 +55,13 @@ public class StatRepository extends DepotRepository /** * Loads the stats associated with the specified player. + * */ public ArrayList loadStats (int playerId) throws PersistenceException { ArrayList stats = new ArrayList(); + // INDEX: Left-most primary key field; Where where = new Where(StatRecord.PLAYER_ID_C, playerId); for (StatRecord record : findAll(StatRecord.class, where)) { Stat stat = decodeStat(record.statCode, record.statData); @@ -86,6 +88,7 @@ public class StatRepository extends DepotRepository }); } }; + // INDEX: Primary key. deleteAll(StatRecord.class, new Where(StatRecord.PLAYER_ID_C, playerId), invalidator); } @@ -225,6 +228,7 @@ public class StatRepository extends DepotRepository throws PersistenceException { for (int ii = 0; ii < 10; ii++) { + // INDEX: Left-most primary key field. MaxStatCodeRecord maxRecord = load( MaxStatCodeRecord.class, new FromOverride(StringCodeRecord.class), @@ -253,6 +257,7 @@ public class StatRepository extends DepotRepository // if it is a duplicate row exception, possibly someone inserted our value // before we could, in which case we can just look up the new mapping + // INDEX: Full primary key. StringCodeRecord record = load( StringCodeRecord.class, StringCodeRecord.getKey(type.code(), value)); if (record != null) { @@ -277,6 +282,7 @@ public class StatRepository extends DepotRepository { QueryClause[] clauses; if (type != null) { + // INDEX: Left-most primary key field. clauses = new QueryClause[] { new Where(StringCodeRecord.STAT_CODE_C, type.code()) }; } else { clauses = new QueryClause[0];