Как реализовать эвристику для выбора подходящего изображения в Java - PullRequest
0 голосов
/ 15 октября 2010

Для страницы, на которой отображается информация о продукте, мы должны выбрать лучшее изображение продукта из набора изображений, которые показывают одинаковое содержимое, но имеют разные форматы (gif, png, jpg и т. Д.), Различного качества (jpeg comrpession), разных размеров (миниатюры, маленькие, средние, большие) и т. д.

Выбор зависит от браузера пользователя, текущего размера страницы, назначения изображения и т. д.

Наше текущее решениезаключается в создании SQL-запроса в соответствии с текущими требованиями, которые могут выглядеть следующим образом:

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

Это простой пример, оригинал гораздо сложнее.Java-код, который создает этот оператор, использует много if и падежей и начинает расти очень некрасиво.

Каков наилучший способ реализации такой эвристики в Java?Есть ли библиотека, которая может помочь?Возможно, в соответствии с определением объектов правил:

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();

Я искал движок правил, и даже есть JSR и некоторые движки правил с открытым исходным кодом, но, похоже, все они имеют дело с правилами Buissness.

У меня есть сильное чувство, что мы изобретаем колесо и что мы просто не можем найти никакого решения, потому что мы не знаем правильного названия для этого материала; -)

Любая помощь будетс благодарностью!

1 Ответ

1 голос
/ 15 октября 2010

Если вы просто создаете SQL-запрос, вы, вероятно, могли бы создать механизм самостоятельно:

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);
      }
 }

Тогда вы можете просто определить интерфейсы как:

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

       public MaxRule() { ... }

       String getSQLWhereClause() { return "img." + fld + " <= " + max; }
       String getSQLOrderClause() { return null; }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...