Index: openacs-4/packages/contacts/lib/contacts.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/contacts/lib/contacts.tcl,v
diff -u -r1.68 -r1.69
--- openacs-4/packages/contacts/lib/contacts.tcl 26 Jun 2006 06:36:51 -0000 1.68
+++ openacs-4/packages/contacts/lib/contacts.tcl 8 Sep 2006 12:10:18 -0000 1.69
@@ -174,6 +174,7 @@
}
# set default_attr_extend [parameter::get -parameter "DefaultPersonAttributeExtension"]
set party_column "persons.person_id"
+ set item_column "persons.person_id"
}
organization {
set page_query_name "organization_pagination"
@@ -182,26 +183,29 @@
}
# set default_attr_extend [parameter::get -parameter "DefaultOrganizationAttributeExtension"]
set party_column "organizations.organization_id"
+ set item_column "organizations.organization_id"
}
party {
set page_query_name "contacts_pagination"
# set default_attr_extend [parameter::get -parameter "DefaultPersonOrganAttributeExtension"]
set party_column "parties.party_id"
+ set item_column "parties.party_id"
}
employee {
set actual_object_type "organization"
- set party_column "acs_rels.object_id_two"
+ set party_column "acs_rels.object_id_one"
+ set item_column "acs_rels.object_id_two"
set page_query_name "employee_pagination"
}
}
set search_clause [contact::search_clause -and -search_id $search_id -query $query -party_id $party_column -revision_id "cr_items.live_revision" -limit_type_p "0"]
if { $orderby eq "last_modified,desc" } {
# we need the cr_items and cr_revisions table since we need the
# cr_revisions.publish date
- append cr_where " and $party_column = cr_items.item_id and cr_items.live_revision = cr_revisions.revision_id"
+ append cr_where " and $item_column = cr_items.item_id and cr_items.live_revision = cr_revisions.revision_id"
append cr_from " cr_items, cr_revisions,"
} elseif {[lsearch -exact $condition_type_list "attribute"] > -1 || [lsearch -exact $condition_type_list "contact"] > -1 } {
- set cr_where "and cr_items.item_id = $party_column"
+ set cr_where "and cr_items.item_id = $item_column"
set cr_from "cr_items,"
} else {
# We don't need to search for attributes so we don't need to join
@@ -223,6 +227,7 @@
set actual_object_type "party"
set page_query_name "contacts_pagination"
set search_clause "[contact::search_clause -and -query $query -search_id "" -party_id "parties.party_id" -limit_type_p "0"]"
+
if { $orderby eq "last_modified,desc" } {
set cr_from "cr_items, cr_revisions,"
set cr_where "and parties.party_id = cr_items.item_id and cr_items.live_revision = cr_revisions.revision_id"
Index: openacs-4/packages/contacts/tcl/contact-search-procs.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/contacts/tcl/contact-search-procs.tcl,v
diff -u -r1.36 -r1.37
--- openacs-4/packages/contacts/tcl/contact-search-procs.tcl 30 Jun 2006 16:00:08 -0000 1.36
+++ openacs-4/packages/contacts/tcl/contact-search-procs.tcl 8 Sep 2006 12:10:19 -0000 1.37
@@ -248,25 +248,35 @@
if { [exists_and_not_null search_id] } {
# Get the results depening on the object_type
set object_type [db_string get_object_type {} -default "party"]
+
+ # The party column is the column of the object we look for
+ # The item column is the column of the item which has the attributes
+ # This allows to search for the attributes of an organization, but have the party
+ # in a special search (employee search)
+
switch $object_type {
party {
set party_column "parties.party_id"
+ set item_column "parties.party_id"
}
organization {
set party_column "organizations.organization_id"
+ set item_column "organizations.organization_id"
}
person {
set party_column "persons.person_id"
+ set item_column "persons.person_id"
}
employee {
- set party_column "acs_rels.object_id_two"
+ set party_column "acs_rels.object_id_one"
+ set item_column "acs_rels.object_id_two"
}
}
set search_clause [contact::search_clause -and -search_id $search_id -query $query -party_id $party_column -revision_id "cr_items.live_revision" -limit_type_p "0"]
set condition_types [db_list get_condition_types {}]
if { [lsearch -exact $condition_types "attribute"] > -1 || [lsearch -exact $condition_types "contact"] > -1 } {
- set cr_where "and cr_items.item_id = $party_column"
+ set cr_where "and cr_items.item_id = $item_column"
set cr_from "cr_items,"
} else {
# We don't need to search for attributes so we don't need to join
@@ -302,38 +312,77 @@
}
ad_proc -private contact::party_id_in_sub_search_clause {
- {-search_id}
+ {-search_id:required}
{-party_id "party_id"}
{-not:boolean}
+ {-package_id ""}
} {
} {
- # If we do not have a search_id, limit the list to only users in the default group.
+
+ if { $package_id eq ""} {
+ set package_id [ad_conn package_id]
+ }
+
+ # Get the results depening on the object_type
+ set object_type [db_string get_object_type {} -default "party"]
- if {[exists_and_not_null search_id]} {
- set group_where_clause ""
+ # The party column is the column of the object we look for
+ # The item column is the column of the item which has the attributes
+ # This allows to search for the attributes of an organization, but have the party
+ # in a special search (employee search)
+
+ switch $object_type {
+ party {
+ set party_column "parties.party_id"
+ set item_column "parties.party_id"
+ }
+ organization {
+ set party_column "organizations.organization_id"
+ set item_column "organizations.organization_id"
+ }
+ person {
+ set party_column "persons.person_id"
+ set item_column "persons.person_id"
+ }
+ employee {
+ set party_column "acs_rels.object_id_one"
+ set item_column "acs_rels.object_id_two"
+ }
+ }
+ set search_clause [contact::search_clause -and -search_id $search_id -party_id $party_column -revision_id "cr_items.live_revision" -limit_type_p "0"]
+
+ set condition_types [db_list get_condition_types {}]
+ if { [lsearch -exact $condition_types "attribute"] > -1 || [lsearch -exact $condition_types "contact"] > -1 } {
+ set cr_where "and cr_items.item_id = $item_column"
+ set cr_from "cr_items,"
} else {
- set group_where_clause "and group_distinct_member_map.group_id in ([template::util::tcl_to_sql_list [contacts::default_groups]])"
-# set group_where_clause "and group_distinct_member_map.group_id = [contacts::default_group]"
+ # We don't need to search for attributes so we don't need to join
+ # on the cr_items table. This should speed things up. This assumes
+ # that packages other than contacts that add search condition
+ # types do not need the revision_id column, and only needs the
+ # party_id column. If this is not the case we may want to add a
+ # callback here to check if another package needs the revisions
+ # table.
+ #
+ # If this needs to change you should also update the
+ # contacts/lib/contacts.tcl file which behave the same way.
+ set cr_where ""
+ set cr_from ""
}
- set query "
- select parties.party_id
- from parties left join cr_items on (parties.party_id = cr_items.item_id) left join cr_revisions on (cr_items.latest_revision = cr_revisions.revision_id ),
- group_distinct_member_map
- where parties.party_id = group_distinct_member_map.member_id
- $group_where_clause
- [contact::search_clause -and -search_id $search_id -query "" -party_id "parties.party_id" -revision_id "revision_id"]
- "
-
-
-
-
+ set results ""
+# if { [catch {
+ set query [db_list select_${object_type} {}]
+# } errmsg] } {
+# ns_log Error "contact::search::results_count_not_cached contact search $search_id had a problem \n\n$errmsg"
+# }
+
if { [exists_and_not_null query] } {
set result ${party_id}
if { $not_p } {
append result " not"
}
- append result " in ( $query )"
+ append result " in ( [template::util::tcl_to_sql_list $query] )"
} else {
set result ""
}
@@ -462,7 +511,6 @@
set query_clauses [list]
set callback_query_clauses [callback contact::search::query_clauses -query $query -party_id $party_id]
-
if { [llength $callback_query_clauses] > 0 } {
# the callback returns a list of the lists from the callbacks
foreach callback_clauses $callback_query_clauses {
Index: openacs-4/packages/contacts/tcl/contact-search-procs.xql
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/contacts/tcl/contact-search-procs.xql,v
diff -u -r1.20 -r1.21
--- openacs-4/packages/contacts/tcl/contact-search-procs.xql 26 Jun 2006 07:02:39 -0000 1.20
+++ openacs-4/packages/contacts/tcl/contact-search-procs.xql 8 Sep 2006 12:10:19 -0000 1.21
@@ -117,6 +117,72 @@
+
+
+ select object_type
+ from contact_searches
+ where search_id = :search_id
+
+
+
+
+
+
+ select type
+ from contact_search_conditions
+ where search_id = :search_id
+
+
+
+
+
+ select distinct parties.party_id
+ from parties, $cr_from group_approved_member_map
+ where parties.party_id = group_approved_member_map.member_id
+ $cr_where
+ and group_approved_member_map.group_id in ([template::util::tcl_to_sql_list [contacts::default_groups -package_id $package_id]])
+ $search_clause
+
+
+
+
+
+ select distinct persons.person_id as party_id
+ from persons, $cr_from group_approved_member_map
+ where persons.person_id = group_approved_member_map.member_id
+ and group_approved_member_map.group_id in ([template::util::tcl_to_sql_list [contacts::default_groups -package_id $package_id]])
+ $cr_where
+ $search_clause
+
+
+
+
+
+ select distinct organizations.organization_id as party_id,
+ from organizations, $cr_from
+ group_approved_member_map
+ where organizations.organization_id = group_approved_member_map.member_id
+ and group_approved_member_map.group_id in ([template::util::tcl_to_sql_list [contacts::default_groups -package_id $package_id]])
+ $cr_where
+ $search_clause
+
+
+
+
+
+ select distinct persons.person_id as party_id
+ from persons, $cr_from
+ group_approved_member_map,
+ acs_rels
+ where persons.person_id = group_approved_member_map.member_id
+ and group_approved_member_map.group_id in ([template::util::tcl_to_sql_list [contacts::default_groups -package_id $package_id]])
+ and persons.person_id = acs_rels.object_id_one
+ and acs_rels.rel_type = 'contact_rels_employment'
+ $cr_where
+ $search_clause
+
+
+
select 1