2012-05-17 2 views
0

Мне нужно реализовать запрос в objectdb и иметь очень мало идей.Запрос в objectdb

Проблема заключается в том, чтобы написать запрос, который

Returns the collection of all laptops each of which has at least one 
      other laptop preinstalled with the same processor. 

Мой класс ноутбук

public class Laptop { 

    String modelName; // key 
    int price;  // in dollars 
    boolean hasHDScreen; // has a HD Screen ? 
    int hardDriveCapacity; // in GB 

    Processor processor; // the preinstalled processor 
    Memory memory; // the preinstalled memory 
    Company madeBy; // the inverse of company.makeLaptops 
} 

и мой процессор класса

public class Processor { 

    String modelName; // key 
    float clockSpeed; // in gigahertz (GHz) 

    Company madeBy; // the inverse of Company.makeProcessors 
} 

Также мое определение функции выглядит ниже

public static Collection<Laptop> sameProcessor(Query q) { 
     /* Returns the collection of all laptops each of which has at least one 
     * other laptop preinstalled with the same processor. 
     */ 
     q.setClass(Laptop.class); 
     q.setFilter("this.processor == "); 

    } 

Как я могу это достичь? SQL тоже будет хорошо.

Thanks

+0

вы используете спящий режим? – ant

+0

@ant: Нет только запросов JDOQL –

+0

@ant: Но запрос в спящем режиме также может быть удобным. Потому что тогда я могу попытаться преобразовать его в JAVA и, следовательно, в язык запросов ObjectDb –

ответ

1

Наконец-то это произошло. Вот решение

public static Collection<Laptop> sameProcessor(Query q) { 
     /* Returns the collection of all laptops each of which has at least one 
     * other laptop preinstalled with the same processor. 
     */ 

     Collection result = new HashSet<Laptop>(); 
     q.setClass(Laptop.class); 

     Collection allLaptops = (Collection) q.execute(); 

     Iterator it = allLaptops.iterator(); 

     while(it.hasNext()) { 
      Laptop currentLaptop = ((Laptop)it.next()); 
      Processor p = currentLaptop.processor; 
      if(p.installedOn(q).size()>=2) { 

       result.add(currentLaptop); 
      } 
     } 

     return (Collection<Laptop>)result;  
    } 

Метод, используемый installedOn определение ниже:

public Collection<Laptop> installedOn(Query q) { 

    /* Returns the collection of all laptops on which the target memory 
     is preinstalled. Represents the inverse of Laptop.memory. 
    */ 
     Memory memory = this; 
     q.setClass(Laptop.class); 
     q.declareParameters("Memory m"); 
     q.setFilter("this.memory == m"); 
     Collection result = (Collection)q.execute(memory); 
     return (Collection<Laptop>) result; 

    } 

Спасибо. Надеюсь, поможет.

Смежные вопросы