2008-11-07 12 views
5

Przy użyciu DBIx::Class i mam zestaw wyników, które muszą być filtrowane przez dane, które nie mogą być generowane przez SQL. Co muszę zrobić, to coś skutecznie równoważne tym hipotetycznym przykładzie:Jak mogę filtrować zestawy wyników DBIX :: Class z danymi zewnętrznymi?

my $resultset  = $schema->resultset('Service')->search(\%search); 
my $new_resultset = $resultset->filter(sub { 
    my $web_service = shift; 
    return $web_service->is_available; 
}); 

Czytając docs daje mi żadnej wskazówki, jak osiągnąć strategię takiego.

Odpowiedz

8

Nie można naprawdę, ze względu na cele, dla których zestawy wyników DBIC zaprojektowanych:

  • one skompilować dół do SQL i uruchomić jedno zapytanie, które robią nie wcześniej niż wtedy, gdy poprosisz o wynikach .
  • Są one składane.

Pozwolenie na filtrowanie według kodu, który działa po stronie Perla, sprawiłoby, że byłoby bardzo owłosione, aby osiągnąć te właściwości, i ukryłoby fakt, że takie zestawy wyników faktycznie działają N zapytań po złożeniu.

Dlaczego tego chcesz? Dlaczego po prostu pobieranie wyników i ich filtrowanie są niewystarczające?

  • Encapsulation? (Np. Ukrywanie logiki filtrowania w warstwie logiki biznesowej, ale wyrzucenie zapytania w warstwie logiki wyświetlania). Następnie wpisz niestandardową podklasę ResultSet, która ma akcesor, który uruchamia zapytanie i wykonuje żądane filtrowanie.

  • Kosztujący? (Np. Odrzucisz większość wyników, więc nie będziesz chciał narzekać na tworzenie obiektów dla nich.) Następnie użyj HashRefInflator.

+0

Mamy kod, który używa zestawów wyników. Jeśli filtrujemy wyniki ręcznie, kod, który oczekuje zestawów wyników, musi zostać radykalnie zmieniony. Proponowane rozwiązanie "filtrujące" jest wynikiem wielu prac nad naszym zespołem szukającym alternatyw, ale przyczyny są zbyt obszerne, aby na nie odpowiedzieć. – Ovid

Powiązane problemy