2010-10-15 13 views
0

Pour une page qui affiche des informations sur un produit, nous devons sélectionner la meilleure image de produit parmi un ensemble d'images qui présentent le même contenu, mais avec des formats différents (gif, png, jpg, etc.), qualité différente (jpeg comrpession), différentes tailles (miniatures, petites, moyennes, grandes) etc.Comment implémenter une heuristique pour sélectionner une image appropriée en Java

Le choix dépend du navigateur de l'utilisateur, de la taille actuelle de la page, du but de l'image, etc.

Notre solution actuelle est de construire une requête SQL selon les exigences actuelles qui pourraient ressembler à ceci:

SELECT img.id 
FROM img 
WHERE img.format IN ('GIF','JPG') 
AND img.width <= 1000 
ORDER BY img.quality DESC 

Ceci est un exemple simple, l'original est beaucoup plus complexe. Le code Java qui crée cette instruction utilise beaucoup de cas et de cas et commence à devenir très moche.

Quelle est la meilleure façon d'implémenter une telle heuristique en Java? Y a-t-il une bibliothèque qui pourrait aider? Peut-être le long des lignes de définition des objets de règles:

Engine engine = new Engine(); 
engine.addRule(new IncludeRule("format", {"GIF", "JPG"}));//only gif and jpg 
engine.addRule(new MaxRule("width", 1000));//max width 
engine.addRule(new WeightedRule("quality", DESC));//go for high quality 
Image result = engine.getResult(); 

J'ai cherché pour le moteur de règle, et il y a même un JSR et certains moteurs de règles open source, mais ils semblent être tout le traitement des règles buissness.

J'ai le sentiment que nous sommes en train de réinventer la roue, et que nous ne pouvons pas trouver une solution parce que nous ne savons pas le bon nom pour ce genre de choses ;-)

Toute aide serait grandement apprécié!

Répondre

1

Si vous construisez juste une requête SQL, vous pouvez probablement construire le moteur vous-même:

public interface Rule{ 
    String getSQLWhereClause(); 
    String getSQLOrderClause(); 
} 

public class Engine 
{ 
    String buildSQLFromRules(Collection<Rule> rules) { 
     String s = "SELECT IMG.ID FROM IMG"; 
     String w = ""; 
     String o = ""; 

     for(Rule r : rules) 
     { 
      if (r.getSQLWhereClause() != null) { 
       if (!w.isEmpty()) { w = w + " AND " } 

        w += r.getSQLWhereClause() 
      } 
      ... same for order 
     } 

     return s + (w.isEmpty()? "" : " WHERE " + w) + (o.isEmpty()?"": " ORDER BY " + o); 
     } 
} 

Ensuite, il vous suffit de définir les interfaces comme:

public class MaxRule implements Rule 
{ 
     String fld; 
     String max; 

     public MaxRule() { ... } 

     String getSQLWhereClause() { return "img." + fld + " <= " + max; } 
     String getSQLOrderClause() { return null; } 
}