Author: bpapez
Date: Wed Nov 21 15:29:27 2007
New Revision: 19247

URL: https://svndev.jahia.net/websvn/listing.php?sc=3D1&rev=3D19247&repname=
=3Djahia
Log:
Optimize select from jahia_link table

Modified:
    branches/JAHIA-4-1-BRANCH/src/java/org/jahia/content/CrossReferenceMana=
ger.java
    branches/JAHIA-4-1-BRANCH/src/java/org/jahia/content/ObjectLinkDB.java

Modified: branches/JAHIA-4-1-BRANCH/src/java/org/jahia/content/CrossReferen=
ceManager.java
URL: https://svndev.jahia.net/websvn/diff.php?path=3D/branches/JAHIA-4-1-BR=
ANCH/src/java/org/jahia/content/CrossReferenceManager.java&rev=3D19247&repn=
ame=3Djahia
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- branches/JAHIA-4-1-BRANCH/src/java/org/jahia/content/CrossReferenceMana=
ger.java (original)
+++ branches/JAHIA-4-1-BRANCH/src/java/org/jahia/content/CrossReferenceMana=
ger.java Wed Nov 21 15:29:27 2007
@@ -80,6 +80,7 @@
     public static final String PRELOADED_OBJECT_LINKS_BY_REF_OBJECT_CACHE =
=3D "PreloadedObjectLinksByRefObjectCache";
 =

     private static final String CONTENT_PAGE_PREFIX =3D "ContentPage";
+    private static final String[] CONTENT_CONTAINERLIST_AND_FIELD_PREFIX =
=3D {"ContentContainerList_%", "ContentField_%"};
 =

     /** the cross reference cache */
     private Cache crossRefTable;
@@ -194,8 +195,9 @@
         if (objectSourceKeys.isEmpty()) {
             // this could be because the keys were not yet loaded from the
             // database, let's make sure we do so if necessary.
-            ArrayList rightLinks =3D ObjectLinkDB.getInstance ().
-                    findByTypeAndLeftObjectKey(REFERENCE_TYPE, objectXRef);
+            ArrayList rightLinks =3D ObjectLinkDB.getInstance()
+                    .findByTypeAndLeftAndLikeRightObjectKeys(REFERENCE_TYP=
E,
+                            objectXRef, CONTENT_CONTAINERLIST_AND_FIELD_PR=
EFIX);
             for (Iterator rightLinksIter =3D rightLinks.listIterator(); ri=
ghtLinksIter.hasNext();) {
                 ObjectLink curLink =3D (ObjectLink)rightLinksIter.next ();
                 objectSourceKeys.add (curLink.getRightObjectKey ());

Modified: branches/JAHIA-4-1-BRANCH/src/java/org/jahia/content/ObjectLinkDB=
.java
URL: https://svndev.jahia.net/websvn/diff.php?path=3D/branches/JAHIA-4-1-BR=
ANCH/src/java/org/jahia/content/ObjectLinkDB.java&rev=3D19247&repname=3Djah=
ia
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- branches/JAHIA-4-1-BRANCH/src/java/org/jahia/content/ObjectLinkDB.java =
(original)
+++ branches/JAHIA-4-1-BRANCH/src/java/org/jahia/content/ObjectLinkDB.java =
Wed Nov 21 15:29:27 2007
@@ -9,6 +9,7 @@
 import java.util.ArrayList;
 import java.util.HashMap;
 =

+import org.apache.lucene.analysis.LetterTokenizer;
 import org.jahia.exceptions.JahiaException;
 import org.jahia.registries.ServicesRegistry;
 import org.jahia.services.database.ConnectionDispenser;
@@ -439,89 +440,95 @@
 =

         return resultList;
     }
+ =

+    protected ArrayList findByTypeAndLeftAndLikeRightObjectKeys(String typ=
e,
+            ObjectKey leftObjectKey, String likeRightObjectKey)
+            throws JahiaException {
+        return findByTypeAndLeftAndLikeRightObjectKeys(type, leftObjectKey,
+                new String[] { likeRightObjectKey });
+    }
 =

-    protected ArrayList findByTypeAndLeftAndLikeRightObjectKeys (String ty=
pe,
-            ObjectKey leftObjectKey,
-            String likeRightObjectKey)
+    protected ArrayList findByTypeAndLeftAndLikeRightObjectKeys(String typ=
e,
+            ObjectKey leftObjectKey, String[] likeRightObjectKeys)
             throws JahiaException {
 =

-            ArrayList resultList =3D new ArrayList();
-            Connection dbConn =3D null;
-            PreparedStatement stmt =3D null;
-            ResultSet rs =3D null;
-
-            final String selectFields =3D "id," +
-                                        "left_oid," +
-                                        "right_oid," +
-                                        "type," +
-                                        "status," +
-                                        "creation_date," +
-                                        "creation_user," +
-                                        "lastmodif_date," +
-                                        "lastmodif_user";
-
-            try {
-                String sqlQuery =3D "SELECT " +
-                                  selectFields +
-                                  " FROM jahia_link WHERE type=3D? AND lef=
t_oid=3D? AND right_oid like ?";
-
-                dbConn =3D org.jahia.services.database.ConnectionDispenser=
.getConnection();
-                stmt =3D dbConn.prepareStatement(sqlQuery);
-                stmt.setString(1, type);
-                stmt.setString(2, leftObjectKey.toString());
-                stmt.setString(3, likeRightObjectKey.toString());
-                // rs can't be null (cf. api)
-                rs =3D stmt.executeQuery();
-
-                while (rs.next()) {
-                    int id =3D rs.getInt("id");
-                    String leftOID =3D rs.getString("left_oid");
-                    String rightOID =3D rs.getString("right_oid");
-                    int status =3D rs.getInt("status");
-                    Timestamp creationDate =3D rs.getTimestamp("creation_d=
ate");
-                    String creationUserKey =3D rs.getString("creation_user=
");
-                    Timestamp lastModificationDate =3D rs.getTimestamp(
-                        "lastmodif_date");
-                    String lastModificationUserKey =3D rs.getString("lastm=
odif_user");
-
-                    try {
-                        resultList.add(new ObjectLink(id,
-                                                      ObjectKey.getInstanc=
e(leftOID),
-                                                      ObjectKey.getInstanc=
e(rightOID),
-                                                      type,
-                                                      status,
-                                                      creationDate, creati=
onUserKey,
-                                                      lastModificationDate,
-                                                      lastModificationUser=
Key,
-                                                      new HashMap(),
-                                                      new HashMap(), new H=
ashMap()));
-                    } catch (ClassNotFoundException cnfe) {
-                        logger.error("Couldn't create instance of an Objec=
tKey",
-                                     cnfe);
-                    }
-                }
-
-            } catch (SQLException se) {
-                throw new JahiaException(
-                    "Cannot load object link by right object key " + likeR=
ightObjectKey +
-                    "from the database",
-                    se.getMessage(),
-                    JahiaException.DATABASE_ERROR,
-                    JahiaException.ERROR_SEVERITY, se);
-            } finally {
+        ArrayList resultList =3D new ArrayList();
+        Connection dbConn =3D null;
+        PreparedStatement stmt =3D null;
+        ResultSet rs =3D null;
+
+        final String selectFields =3D "id," + "left_oid," + "right_oid,"
+                + "type," + "status," + "creation_date," + "creation_user,"
+                + "lastmodif_date," + "lastmodif_user";
+
+        try {
+            StringBuffer sqlQuery =3D new StringBuffer(128);
+            sqlQuery.append("SELECT ").append(selectFields).append(
+                    " FROM jahia_link WHERE type=3D? AND left_oid=3D? AND =
(");
+
+            for (int i =3D 0; i < likeRightObjectKeys.length; i++) {
+                if (i !=3D 0) {
+                    sqlQuery.append(" or ");
+                }
+                sqlQuery.append("right_oid like ?");
+            }
+            sqlQuery.append(")");
+
+            dbConn =3D org.jahia.services.database.ConnectionDispenser
+                    .getConnection();
+            stmt =3D dbConn.prepareStatement(sqlQuery.toString());
+            int paramCounter =3D 1;
+            stmt.setString(paramCounter++, type);
+            stmt.setString(paramCounter++, leftObjectKey.toString());
+            for (int i =3D 0; i < likeRightObjectKeys.length; i++) {
+                stmt.setString(paramCounter++, likeRightObjectKeys[i]);
+            }
+            // rs can't be null (cf. api)
+            rs =3D stmt.executeQuery();
+
+            while (rs.next()) {
+                int id =3D rs.getInt("id");
+                String leftOID =3D rs.getString("left_oid");
+                String rightOID =3D rs.getString("right_oid");
+                int status =3D rs.getInt("status");
+                Timestamp creationDate =3D rs.getTimestamp("creation_date"=
);
+                String creationUserKey =3D rs.getString("creation_user");
+                Timestamp lastModificationDate =3D rs
+                        .getTimestamp("lastmodif_date");
+                String lastModificationUserKey =3D rs.getString("lastmodif=
_user");
+
                 try {
-                    if (stmt !=3D null)
-                        stmt.close();
-                } catch (SQLException ex) {
-                    throw new JahiaException("Cannot free resources",
-                                             "Cannot free resources",
-                                             JahiaException.DATABASE_ERROR,
-                                             JahiaException.WARNING_SEVERI=
TY, ex);
+                    resultList.add(new ObjectLink(id, ObjectKey
+                            .getInstance(leftOID), ObjectKey
+                            .getInstance(rightOID), type, status, creation=
Date,
+                            creationUserKey, lastModificationDate,
+                            lastModificationUserKey, new HashMap(),
+                            new HashMap(), new HashMap()));
+                } catch (ClassNotFoundException cnfe) {
+                    logger.error("Couldn't create instance of an ObjectKey=
",
+                            cnfe);
                 }
             }
 =

-            return resultList;
-        }    =

+        } catch (SQLException se) {
+            throw new JahiaException(
+                    "Cannot load object link by right object key "
+                            + likeRightObjectKeys + "from the database", se
+                            .getMessage(), JahiaException.DATABASE_ERROR,
+                    JahiaException.ERROR_SEVERITY, se);
+        } finally {
+            try {
+                if (stmt !=3D null)
+                    stmt.close();
+            } catch (SQLException ex) {
+                throw new JahiaException("Cannot free resources",
+                        "Cannot free resources", JahiaException.DATABASE_E=
RROR,
+                        JahiaException.WARNING_SEVERITY, ex);
+            }
+        }
+
+        return resultList;
+    }    =

     =

     protected ArrayList findByTypeAndLeftAndRightObjectKeys (String type,
         ObjectKey leftObjectKey,

_______________________________________________
cvs_list mailing list
[email protected]
http://lists.jahia.org/cgi-bin/mailman/listinfo/cvs_list

Reply via email to