2014-02-21 1 views
1

Я сделал приложение, используя валютный плагин для представления денег, он представляет 3 класса домена, Money, и ExchangeRate.Лучший способ помочь производительности плагинов валют при выполнении вычислений

вот класс домена Money:

https://github.com/ricardojmendez/grails-currencies/blob/master/src/groovy/cr/co/arquetipos/currencies/Money.groovy

Просто ради проще объяснить, давайте просто скажем, что у меня есть 2 классов: SalesOrder и OrderItem.

SalesOrder:

class SalesOrder { 


     static hasMany = [orderItems:OrderItem] 

     List<OrderItem> orderItems 
     String customer 
     def getTotal(){ 
      Money total = Money.getInstance("0 USD") 
      orderItems.each{ 
       total+=it.getTotal() 
      } 
      total 
     } 

} 

OrderItem:

class OrderItem{ 



     static belongsTo = [salesOrder:SalesOrder] 
     static embedded = ['price'] 

     Money price 
     int quantity 
     String itemName 

     def getTotal(){ 
      price * quantity 
     } 

} 

Цель состоит в том, чтобы получить в общей сложности для каждого SalesOrder, так как я не думаю, что я могу написать запрос для Money для расчета общего

(потому что exchangeRate и валюта участвуют в каждом объекте Money):

У меня может быть одна сумма денег, которая определяется как «сумма: 25, валюта: доллар США» и другая «сумма: 500, валюта: JPY», если я просто запрошу сумму, результат будет выключен, так как он не будет конвертировать валюту в одну и ту же.

, я был вынужден бежать петли через каждый OrderItem в SalesOrder, как вы можете себе представить, выступление было настолько плохо, что мне потребовалось около 18 секунд, чтобы получить в общей сложности в течение 30 SalesOrder с. (Я смог снизить это до 9 секунд после добавления «orderItems fetch:« join »в статическом сопоставлении SalesOrder, но еще 9 секунд все еще слишком много)

Этот плагин не очень популярен, t найти случай, когда любой, кто сталкивался с такими вещами, поэтому, если у вас есть опыт в решении этой проблемы, пожалуйста, помогите мне.

Thanks

ответ

0

Почему нет? Что-то вроде

def total = OrderItem.withCriteria(uniqueResult:true){ 
    projections{ sum 'price.amount' } 
    eq 'salesOrder', salesOrder 
} 

может сделать трюк

+0

, потому что валюта/обменный курс участвуют, не все деньги сохраняются в той же валюте, преобразование должно быть выполнено для каждого денежного объекта, который имеет другую валюту. Я мог бы сохранить один «25 долларов США» и один «5000 JPY», если вы просто запросите сумму, общая сумма будет отключена на много. – 16dots

+0

ОК, я понял. Я бы добавил новое поле для хранения цены в одной валюте, скажем в '$' и сохранил все другие валютные значения, пересчитав в '$'. Таким образом, вы всегда можете получить сумму в долларах и перевести ее в целевую валюту. Это не очень прямолинейно, но у вас едва ли есть другой вариант здесь – injecteer