Index: openacs-4/packages/ecommerce/www/product-search-oracle.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/ecommerce/www/product-search-oracle.xql,v diff -u -r1.3 -r1.3.4.1 --- openacs-4/packages/ecommerce/www/product-search-oracle.xql 30 Nov 2002 17:31:29 -0000 1.3 +++ openacs-4/packages/ecommerce/www/product-search-oracle.xql 10 Jun 2005 08:59:49 -0000 1.3.4.1 @@ -8,35 +8,89 @@ - select p.product_name, p.product_id, p.dirname, - p.one_line_description,pseudo_contains(p.product_name || p.one_line_description || p.detailed_description || p.search_keywords, :search_text) as score + select r.* + from ( + select rownum as r_rownum, q.* + from ( + select p.product_name, p.product_id, p.dirname, + p.one_line_description,pseudo_contains(p.product_name || p.one_line_description || p.detailed_description || p.search_keywords, :search_text) as score + from ec_products_searchable p, ec_category_product_map c + where c.category_id=:category_id + and p.product_id=c.product_id + and pseudo_contains(p.product_name || p.one_line_description || p.detailed_description || p.search_keywords, :search_text) > 0 + order by score desc + ) q + ) r + where r_rownum > :start_row + and r_rownum <= :start_row + :rows_per_page + + + + + + select count(*) from ec_products_searchable p, ec_category_product_map c where c.category_id=:category_id and p.product_id=c.product_id and pseudo_contains(p.product_name || p.one_line_description || p.detailed_description || p.search_keywords, :search_text) > 0 - order by score desc + - select p.product_name, p.product_id, p.dirname, - p.one_line_description,pseudo_contains(p.product_name || p.one_line_description || p.detailed_description || p.search_keywords, :search_text) as score + select r.* + from ( + select rownum as r_rownum, q.* + from ( + select p.product_name, p.product_id, p.dirname, + p.one_line_description,pseudo_contains(p.product_name || p.one_line_description || p.detailed_description || p.search_keywords, :search_text) as score + from ec_products_searchable p, ec_subcategory_product_map c + where c.subcategory_id=:subcategory_id + and p.product_id=c.product_id + and pseudo_contains(p.product_name || p.one_line_description || p.detailed_description || p.search_keywords, :search_text) > 0 + order by score desc + ) q + ) r + where r_rownum > :start_row + and r_rownum <= :start_row + :rows_per_page + + + + + + select count(*) from ec_products_searchable p, ec_subcategory_product_map c where c.subcategory_id=:subcategory_id and p.product_id=c.product_id and pseudo_contains(p.product_name || p.one_line_description || p.detailed_description || p.search_keywords, :search_text) > 0 - order by score desc + - select p.product_name, p.product_id, p.dirname, - p.one_line_description,pseudo_contains(p.product_name || p.one_line_description || p.detailed_description || p.search_keywords, :search_text) as score + select r.* + from ( + select rownum as r_rownum, q.* + from ( + select p.product_name, p.product_id, p.dirname, + p.one_line_description,pseudo_contains(p.product_name || p.one_line_description || p.detailed_description || p.search_keywords, :search_text) as score + from ec_products_searchable p + where pseudo_contains(p.product_name || p.one_line_description || p.detailed_description || p.search_keywords, :search_text) > 0 + order by score desc + ) q + ) r + where r_rownum > :start_row + and r_rownum <= :start_row + :rows_per_page + + + + + + select count(*) from ec_products_searchable p where pseudo_contains(p.product_name || p.one_line_description || p.detailed_description || p.search_keywords, :search_text) > 0 - order by score desc Index: openacs-4/packages/ecommerce/www/product-search-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/ecommerce/www/product-search-postgresql.xql,v diff -u -r1.3 -r1.3.4.1 --- openacs-4/packages/ecommerce/www/product-search-postgresql.xql 30 Nov 2002 17:31:29 -0000 1.3 +++ openacs-4/packages/ecommerce/www/product-search-postgresql.xql 10 Jun 2005 08:59:49 -0000 1.3.4.1 @@ -14,10 +14,20 @@ where c.category_id=:category_id and p.product_id=c.product_id and pseudo_contains(coalesce(p.product_name, '') || coalesce(p.one_line_description, '') || coalesce(p.detailed_description, '') || coalesce(p.search_keywords,''), :search_text) > 0 - order by score desc + order by score desc limit :rows_per_page offset :start_row + + + select count(*) as search_count + from ec_products_searchable p, ec_category_product_map c + where c.category_id=:category_id + and p.product_id=c.product_id + and pseudo_contains(coalesce(p.product_name, '') || coalesce(p.one_line_description, '') || coalesce(p.detailed_description, '') || coalesce(p.search_keywords,''), :search_text) > 0 + + + select p.product_name, p.product_id, p.dirname, p.one_line_description, @@ -26,18 +36,36 @@ where c.subcategory_id=:subcategory_id and p.product_id=c.product_id and pseudo_contains(coalesce(p.product_name, '') || coalesce(p.one_line_description, '') || coalesce(p.detailed_description, '') || coalesce(p.search_keywords,''), :search_text) > 0 - order by score desc + order by score desc limit :rows_per_page offset :start_row + + + select count(*) as search_count + from ec_products_searchable p, ec_subcategory_product_map c + where c.subcategory_id=:subcategory_id + and p.product_id=c.product_id + and pseudo_contains(coalesce(p.product_name, '') || coalesce(p.one_line_description, '') || coalesce(p.detailed_description, '') || coalesce(p.search_keywords,''), :search_text) > 0 + + + select p.product_name, p.product_id, p.dirname, p.one_line_description, pseudo_contains(coalesce(p.product_name, '') || coalesce(p.one_line_description, '') || coalesce(p.detailed_description, '') || coalesce(p.search_keywords,''), :search_text) as score from ec_products_searchable p where pseudo_contains(coalesce(p.product_name, '') || coalesce(p.one_line_description, '') || coalesce(p.detailed_description, '') || coalesce(p.search_keywords,''), :search_text) > 0 - order by score desc + order by score desc limit :rows_per_page offset :start_row + + + select count(*) as search_count + from ec_products_searchable p + where pseudo_contains(coalesce(p.product_name, '') || coalesce(p.one_line_description, '') || coalesce(p.detailed_description, '') || coalesce(p.search_keywords,''), :search_text) > 0 + + + Index: openacs-4/packages/ecommerce/www/product-search.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/ecommerce/www/product-search.tcl,v diff -u -r1.6.4.4 -r1.6.4.5 --- openacs-4/packages/ecommerce/www/product-search.tcl 22 Apr 2005 09:33:36 -0000 1.6.4.4 +++ openacs-4/packages/ecommerce/www/product-search.tcl 10 Jun 2005 08:59:49 -0000 1.6.4.5 @@ -52,6 +52,9 @@ set subcategory_id [lindex [split $combocategory_id "|"] 1] } +# filter extra spaces +regsub -all -- {\s+} $search_text { } search_text] +set search_text "[string trim $search_text]" # filter overflow attempts from really long search strings set search_text "[string range $search_text 0 100 ]" @@ -72,37 +75,42 @@ if { ![empty_string_p $subcategory_id] && $subcategory_id > 0} { set query_string [db_map search_subcategory] + set query_count_string [db_map search_count_subcategory] # select p.product_name, p.product_id, p.dirname, p.one_line_description,pseudo_contains(p.product_name || p.one_line_description || p.detailed_description || p.search_keywords, :search_text) as score # from ec_products_searchable p, ec_subcategory_product_map c # where c.subcategory_id=:subcategory_id # and p.product_id=c.product_id # and pseudo_contains(p.product_name || p.one_line_description || p.detailed_description || p.search_keywords, :search_text) > 0 - # order by score desc + # order by score desc limit :rows_per_page offset :start_row } else { if { ![empty_string_p $category_id] } { set query_string [db_map search_category] + set query_count_string [db_map search_count_category] # select p.product_name, p.product_id, p.dirname, p.one_line_description,pseudo_contains(p.product_name || p.one_line_description || p.detailed_description || p.search_keywords, :search_text) as score # from ec_products_searchable p, ec_category_product_map c # where c.category_id=:category_id # and p.product_id=c.product_id # and pseudo_contains(p.product_name || p.one_line_description || p.detailed_description || p.search_keywords, :search_text) > 0 - # order by score desc + # order by score desc limit :rows_per_page offset :start_row } else { set query_string [db_map search_all] + set query_count_string [db_map search_count_all] # select p.product_name, p.product_id, p.dirname, p.one_line_description,pseudo_contains(p.product_name || p.one_line_description || p.detailed_description || p.search_keywords, :search_text) as score # from ec_products_searchable p # where pseudo_contains(p.product_name || p.one_line_description || p.detailed_description || p.search_keywords, :search_text) > 0 - # order by score desc + # order by score desc limit :rows_per_page offset :start_row } } set search_string "" -set search_count 0 +set page_count 0 +# make search_count equal to count(*) of query +# getting the count of search results requires a second db hit, +# which is magnitudes better than the tcl filtering that used to be in this loop +db_1row get_search_count $query_count_string set have_how_many_more_p "f" set end_row_of_next_page [expr $start_row + (2 * $rows_per_page)] db_foreach get_product_listing_from_search $query_string { - - if { $search_count >= $start_row && [expr $search_count - $start_row] < $rows_per_page } { append search_string " @@ -117,14 +125,14 @@
[ec_linked_thumbnail_if_it_exists $dirname "t" "t"]
" - set last_row_this_page [expr $search_count + 1] - } - incr search_count - if { $search_count > $end_row_of_next_page } { + + incr page_count +} +set last_row_this_page [expr $page_count + $start_row ] +if { $search_count > $end_row_of_next_page } { # we know there are at least how_many more items to display next time set have_how_many_more_p "t" - } -} +} if { $start_row >= $rows_per_page } { set prev_link "Previous $rows_per_page" @@ -135,7 +143,7 @@ if { [string equal $have_how_many_more_p "t"] } { set next_link "Next $rows_per_page" } else { - set number_of_remaining_products [expr $search_count - $start_row - $rows_per_page] + set number_of_remaining_products [expr $search_count - $start_row - $rows_per_page ] if { $number_of_remaining_products > 0 } { set next_link "Next $number_of_remaining_products" } else {