2012-01-05 9 views
0

リストビューの異なるカスタムビューのレコード数を取得するための問題を解決しようとしています。カスタムビューは、いくつかの追加基準があるユーザー定義ビューです。異なるカスタムビューのレコード数

例:

All Records View(3): {criteria : none} 
    Name |email  |age 
    John |[email protected]| 23 
    Ann |[email protected] | 20 
    Jack |[email protected]| 13 


    Kids View(1): {criteria : age<15} 
    Name |email  |age 
    Jack |[email protected]| 13 

    Foo Kids View(1): {criteria : age<15 and email contains('foo.com')} 
    Name |email  |age 
    Jack |[email protected]| 13 

ビューカウントは各view.Theについて計算されなければならない基準に応じて上記の例で与えられた各ビューは、ユーザが特定の選択も前に表示されているためカウントとして複数のユーザーがレコードの/追加/更新/削除レコードを表示しています。各ビューのカウントを表示するたびにmysqlクエリを実行すると、何百万もの行が存在する可能性があるため、 memcachedまたはredisビューの最初のレコード数を格納し、後で変更が発生したときに更新します。ここでの問題は、クエストは、実行時にどのビューを動的に表示するかです。

例: 'Jacks'レコードが削除された場合、すべてのビューでビューの数を減算する必要があります。年齢が20に更新された場合と同様に、カウントは子供のビューとfooの子供のビューから差し引かれます。

問題に取り組むための方法上の任意の提案は大歓迎です。..

+0

それは問題が何であるか本当にはっきりしていません。あなたは詳しく説明できますか? –

+0

@Sergio Tulentsev:わかっていない部分はすみませんでした。 – Emil

+0

Emil:「実行時にどのビューがどのビューに対して動的に要求されるか」の部分。 –

答えて

1

オプション1:キャッシング。キャッシュレコードはどこかでカウントされ(memcached、redis)、カウンタをリフレッシュするcronジョブを定期的に実行します。カウンタがわずかに不正確な場合は、あまり気にしないでください。

オプション2:ルーティングロジックをコードに保存します。あなたの言語はそれを簡単にするかもしれません。これはRubyで見えるかもしれ方法です。

class ViewMatcher 
    def initialize 
    @views = {'all' => lambda{|params| true }, 

       'kids' => lambda{|params| params[:age] && params[:age] < 15 }, 

       'foo kids' => lambda{|params| params[:age] && 
              params[:age] < 15 && 
              params[:email] && 
              params[:email].include?('foo')}} 
    end 

    def print_matching_views(params) 
    puts "Matching views for query: #{params.inspect}" 
    result = [] 
    @views.each do |k, v| 
     result << k if v.call(params) 
    end 
    puts result 
    puts "" 
    end 
end 


vm = ViewMatcher.new 

vm.print_matching_views :age => 10 
vm.print_matching_views :age => 20 
vm.print_matching_views :age => 10, :email => '[email protected]' 
vm.print_matching_views :age => 10, :email => '[email protected]' 

出力:

Matching views for query: {:age=>10} 
all 
kids 

Matching views for query: {:age=>20} 
all 

Matching views for query: {:age=>10, :email=>"[email protected]"} 
all 
kids 
foo kids 

Matching views for query: {:age=>10, :email=>"[email protected]"} 
all 
kids 
+0

ありがとう、私は、Javaでどのように2番目のソリューションが実装されるのか見ておく必要があります。 – Emil

+0

@エミール:そこにお手伝いできません、私は非常にJavaで良いではありません。しかし、それは確かに実行可能です(それは醜いかもしれませんが:-))。 –

関連する問題