diff --git a/src/main/java/org/olat/repository/manager/RepositoryEntryAuthorQueries.java b/src/main/java/org/olat/repository/manager/RepositoryEntryAuthorQueries.java index 0a2b7abe184215c715086cebe2f538fe7d984982..23271958132d3c2bbfcdd1f0b73c1cd1d5cae0b6 100644 --- a/src/main/java/org/olat/repository/manager/RepositoryEntryAuthorQueries.java +++ b/src/main/java/org/olat/repository/manager/RepositoryEntryAuthorQueries.java @@ -23,7 +23,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import javax.persistence.FlushModeType; import javax.persistence.TypedQuery; import org.olat.basesecurity.GroupRoles; @@ -81,7 +80,7 @@ public class RepositoryEntryAuthorQueries { return 0; } - TypedQuery<Number> query = createViewQuery(params, false, Number.class); + TypedQuery<Number> query = createViewQuery(params, Number.class); Number count = query.getSingleResult(); return count == null ? 0 : count.intValue(); } @@ -91,28 +90,10 @@ public class RepositoryEntryAuthorQueries { log.error("No identity defined for query"); return new RepositoryEntryAuthorViewResults(Collections.emptyList(), true); } - - List<String> inMemoryTypes = null; - if(params.isOwnedResourcesOnly() && params.isResourceTypesDefined()) { - maxResults = -1; - if(params.getResourceTypes().size() == 1) { - inMemoryTypes = Collections.singletonList(params.getResourceTypes().get(0)); - } else { - inMemoryTypes = params.getResourceTypes(); - } - } - - if(StringHelper.containsNonWhitespace(params.getAuthor()) && dbInstance.isMySQL()) { - List<Long> repoKeys = getAuthorRepoKeys(params.getAuthor()); - if(repoKeys.isEmpty()) { - return new RepositoryEntryAuthorViewResults(Collections.emptyList(), true); - } - params.setAuthorEntryKeys(repoKeys); - } - TypedQuery<Object[]> query = createViewQuery(params, inMemoryTypes != null, Object[].class); + TypedQuery<Object[]> query = createViewQuery(params, Object[].class); query.setFirstResult(firstResult); - if(maxResults > 0 && inMemoryTypes == null) { + if(maxResults > 0) { query.setMaxResults(maxResults); } @@ -120,9 +101,6 @@ public class RepositoryEntryAuthorQueries { List<RepositoryEntryAuthorView> views = new ArrayList<>(objects.size()); for(Object[] object:objects) { RepositoryEntry re = (RepositoryEntry)object[0]; - if(inMemoryTypes != null &&!inMemoryTypes.contains(re.getOlatResource().getResourceableTypeName())) { - continue; - } Number numOfMarks = (Number)object[1]; boolean hasMarks = numOfMarks != null && numOfMarks.longValue() > 0; @@ -149,32 +127,10 @@ public class RepositoryEntryAuthorQueries { views.add(new RepositoryEntryAuthorImpl(re, hasMarks, offers, references, deletedByName, lectureEnabled, rollCallEnabled)); } - return new RepositoryEntryAuthorViewResults(views, inMemoryTypes != null || maxResults <= 0); - } - - private List<Long> getAuthorRepoKeys(String author) { - StringBuilder sb = new StringBuilder(512); - sb.append("select distinct rel.entry.key from repoentrytogroup as rel") - .append(" inner join rel.group as rGroup") - .append(" inner join rGroup.members as membership") - .append(" inner join membership.identity as ident") - .append(" inner join ident.user as user") - .append(" where membership.role='owner' and "); - PersistenceHelper.appendFuzzyLike(sb, "user.firstName", "author", dbInstance.getDbVendor()); - sb.append(" or "); - PersistenceHelper.appendFuzzyLike(sb, "user.lastName", "author", dbInstance.getDbVendor()); - sb.append(" or "); - PersistenceHelper.appendFuzzyLike(sb, "ident.name", "author", dbInstance.getDbVendor()); - sb.append(" "); - return dbInstance.getCurrentEntityManager() - .createQuery(sb.toString(), Long.class) - .setFlushMode(FlushModeType.COMMIT) - .setParameter("author", PersistenceHelper.makeFuzzyQueryString(author)) - .getResultList(); + return new RepositoryEntryAuthorViewResults(views, maxResults <= 0); } - protected <T> TypedQuery<T> createViewQuery(SearchAuthorRepositoryEntryViewParams params, boolean inMemoryTypes, - Class<T> type) { + protected <T> TypedQuery<T> createViewQuery(SearchAuthorRepositoryEntryViewParams params, Class<T> type) { IdentityRef identity = params.getIdentity(); List<String> resourceTypes = params.getResourceTypes(); @@ -233,7 +189,7 @@ public class RepositoryEntryAuthorQueries { sb.append(" exists (select ref.key from references as ref where ref.target.key=res.key)"); } - if (params.isResourceTypesDefined() && !inMemoryTypes) { + if (params.isResourceTypesDefined()) { sb.append(" and res.resName in (:resourcetypes)"); } if(params.getMarked() != null && params.getMarked().booleanValue()) { @@ -250,9 +206,7 @@ public class RepositoryEntryAuthorQueries { } String author = null; - if(params.getAuthorEntryKeys() != null && !params.getAuthorEntryKeys().isEmpty()) { - sb.append(" and v.key in (:authorEntryKeys)"); - } else if (StringHelper.containsNonWhitespace(params.getAuthor())) { // fuzzy author search + if (StringHelper.containsNonWhitespace(params.getAuthor())) { // fuzzy author search author = PersistenceHelper.makeFuzzyQueryString(params.getAuthor()); sb.append(" and v.key in (select rel.entry.key from repoentrytogroup as rel, bgroupmember as membership, ") @@ -331,7 +285,7 @@ public class RepositoryEntryAuthorQueries { TypedQuery<T> dbQuery = dbInstance.getCurrentEntityManager() .createQuery(sb.toString(), type); - if (params.isResourceTypesDefined() && !inMemoryTypes) { + if (params.isResourceTypesDefined()) { dbQuery.setParameter("resourcetypes", resourceTypes); } if(id != null) { @@ -354,9 +308,7 @@ public class RepositoryEntryAuthorQueries { dbQuery.setParameter("quickText", quickText); } - if(params.getAuthorEntryKeys() != null && !params.getAuthorEntryKeys().isEmpty()) { - dbQuery.setParameter("authorEntryKeys", params.getAuthorEntryKeys()); - } else if (StringHelper.containsNonWhitespace(author)) { // fuzzy author search + if (StringHelper.containsNonWhitespace(author)) { // fuzzy author search dbQuery.setParameter("author", author); } if (StringHelper.containsNonWhitespace(displayname)) { diff --git a/src/main/java/org/olat/repository/model/SearchAuthorRepositoryEntryViewParams.java b/src/main/java/org/olat/repository/model/SearchAuthorRepositoryEntryViewParams.java index dc17f90739762f1eea2fdafbadb55f92c8a66e33..829d2fcbad29a8980cfc42a1559199e5a17ea5bf 100644 --- a/src/main/java/org/olat/repository/model/SearchAuthorRepositoryEntryViewParams.java +++ b/src/main/java/org/olat/repository/model/SearchAuthorRepositoryEntryViewParams.java @@ -45,7 +45,6 @@ public class SearchAuthorRepositoryEntryViewParams { private String idAndRefs; private String idRefsAndTitle; private String author; - private List<Long> authorEntryKeys; private String displayname; private String description; @@ -89,15 +88,6 @@ public class SearchAuthorRepositoryEntryViewParams { public void setAuthor(String author) { this.author = author; - authorEntryKeys = null; - } - - public List<Long> getAuthorEntryKeys() { - return authorEntryKeys; - } - - public void setAuthorEntryKeys(List<Long> authorEntryKeys) { - this.authorEntryKeys = authorEntryKeys; } public String getDisplayname() { diff --git a/src/main/java/org/olat/repository/ui/author/AuthorSearchController.java b/src/main/java/org/olat/repository/ui/author/AuthorSearchController.java index aeb3766759d879903ae39007e561378698ca7942..64026035c567a39e0ee137c45601bdaf72ddb3be 100644 --- a/src/main/java/org/olat/repository/ui/author/AuthorSearchController.java +++ b/src/main/java/org/olat/repository/ui/author/AuthorSearchController.java @@ -301,13 +301,13 @@ public class AuthorSearchController extends FormBasicController implements Exten author.clearError(); if (displayName.isEmpty() && author.isEmpty() && description.isEmpty() && (id != null && id.isEmpty())) { showWarning("cif.error.allempty"); - return false; + //return false; } int maxSize = dbInstance.isMySQL() ? 5 : 3; if(StringHelper.containsNonWhitespace(author.getValue()) && author.getValue().length() < maxSize) { author.setErrorKey("form.error.tooshort", new String[] { Integer.toString(maxSize) }); - return false; + //return false; } return true; @@ -327,7 +327,7 @@ public class AuthorSearchController extends FormBasicController implements Exten @Override protected void formInnerEvent (UserRequest ureq, FormItem source, FormEvent event) { - if(enabled && source == searchButton && validateFormLogic(ureq)) { + if(enabled && source == searchButton) { fireSearchEvent(ureq); } } diff --git a/src/main/resources/database/mysql/alter_13_2_x_to_13_2_3.sql b/src/main/resources/database/mysql/alter_13_2_x_to_13_2_3.sql new file mode 100644 index 0000000000000000000000000000000000000000..25ab7114494525bf065abf8af3d8cdc119eff924 --- /dev/null +++ b/src/main/resources/database/mysql/alter_13_2_x_to_13_2_3.sql @@ -0,0 +1,77 @@ +drop view if exists o_bs_gp_membership_v; +drop view if exists o_re_membership_v; +drop view if exists o_gp_contactext_v; +drop view if exists o_gp_contactkey_v; +drop view if exists o_gp_business_v; + +drop index member_to_grp_role_idx on o_bs_group_member; + +alter table o_bs_group_member modify g_role varchar(24); + +create index group_role_member_idx on o_bs_group_member (fk_group_id,g_role,fk_identity_id); + + +create view o_bs_gp_membership_v as ( + select + membership.id as membership_id, + membership.fk_identity_id as fk_identity_id, + membership.lastmodified as lastmodified, + membership.creationdate as creationdate, + membership.g_role as g_role, + gp.group_id as group_id + from o_bs_group_member as membership + inner join o_gp_business as gp on (gp.fk_group_id=membership.fk_group_id) +); + +create or replace view o_re_membership_v as ( + select + bmember.id as membership_id, + bmember.creationdate as creationdate, + bmember.lastmodified as lastmodified, + bmember.fk_identity_id as fk_identity_id, + bmember.g_role as g_role, + re.repositoryentry_id as fk_entry_id + from o_repositoryentry as re + inner join o_re_to_group relgroup on (relgroup.fk_entry_id=re.repositoryentry_id and relgroup.r_defgroup=1) + inner join o_bs_group_member as bmember on (bmember.fk_group_id=relgroup.fk_group_id) +); + +-- contacts +create view o_gp_contactkey_v as ( + select + bg_member.id as membership_id, + bg_member.fk_identity_id as member_id, + bg_member.g_role as membership_role, + bg_me.fk_identity_id as me_id, + bgroup.group_id as bg_id + from o_gp_business as bgroup + inner join o_bs_group_member as bg_member on (bg_member.fk_group_id = bgroup.fk_group_id) + inner join o_bs_group_member as bg_me on (bg_me.fk_group_id = bgroup.fk_group_id) + where + (bgroup.ownersintern=1 and bg_member.g_role='coach') + or + (bgroup.participantsintern=1 and bg_member.g_role='participant') +); + +create view o_gp_contactext_v as ( + select + bg_member.id as membership_id, + bg_member.fk_identity_id as member_id, + bg_member.g_role as membership_role, + id_member.name as member_name, + us_member.u_firstname as member_firstname, + us_member.u_lastname as member_lastname, + bg_me.fk_identity_id as me_id, + bgroup.group_id as bg_id, + bgroup.groupname as bg_name + from o_gp_business as bgroup + inner join o_bs_group_member as bg_member on (bg_member.fk_group_id = bgroup.fk_group_id) + inner join o_bs_identity as id_member on (bg_member.fk_identity_id = id_member.id) + inner join o_user as us_member on (id_member.id = us_member.fk_identity) + inner join o_bs_group_member as bg_me on (bg_me.fk_group_id = bgroup.fk_group_id) + where + (bgroup.ownersintern=1 and bg_member.g_role='coach') + or + (bgroup.participantsintern=1 and bg_member.g_role='participant') +); + diff --git a/src/main/resources/database/mysql/setupDatabase.sql b/src/main/resources/database/mysql/setupDatabase.sql index f59d0bd5196189f23c45cc38b1c05b6960c5a35d..2e388edce949f56dcf54573f3762962dbba6221d 100644 --- a/src/main/resources/database/mysql/setupDatabase.sql +++ b/src/main/resources/database/mysql/setupDatabase.sql @@ -50,7 +50,7 @@ create table o_bs_group_member ( id bigint not null, creationdate datetime not null, lastmodified datetime not null, - g_role varchar(50) not null, + g_role varchar(24) not null, g_inheritance_mode varchar(16) default 'none' not null, fk_group_id bigint not null, fk_identity_id bigint not null, @@ -3109,7 +3109,7 @@ create index idx_prop_restype_idx on o_property (resourcetypename); -- group alter table o_bs_group_member add constraint member_identity_ctx foreign key (fk_identity_id) references o_bs_identity (id); alter table o_bs_group_member add constraint member_group_ctx foreign key (fk_group_id) references o_bs_group (id); -create index member_to_grp_role_idx on o_bs_group_member (g_role); +create index group_role_member_idx on o_bs_group_member (fk_group_id,g_role,fk_identity_id); alter table o_re_to_group add constraint re_to_group_group_ctx foreign key (fk_group_id) references o_bs_group (id); alter table o_re_to_group add constraint re_to_group_re_ctx foreign key (fk_entry_id) references o_repositoryentry (repositoryentry_id); diff --git a/src/main/resources/database/oracle/alter_13_2_x_to_13_2_3.sql b/src/main/resources/database/oracle/alter_13_2_x_to_13_2_3.sql new file mode 100644 index 0000000000000000000000000000000000000000..69cde97455622b912ff4b281e89a7b5d4cf79caf --- /dev/null +++ b/src/main/resources/database/oracle/alter_13_2_x_to_13_2_3.sql @@ -0,0 +1,76 @@ +drop view o_bs_gp_membership_v; +drop view o_re_membership_v; +drop view o_gp_contactext_v; +drop view o_gp_contactkey_v; +drop view o_gp_business_v; + +drop index member_to_grp_role_idx; + +alter table o_bs_group_member modify g_role varchar2(24 char); + +create index group_role_member_idx on o_bs_group_member (fk_group_id,g_role,fk_identity_id); + + +create view o_bs_gp_membership_v as ( + select + gp.group_id as group_id, + membership.id as membership_id, + membership.fk_identity_id as fk_identity_id, + membership.lastmodified as lastmodified, + membership.creationdate as creationdate, + membership.g_role as g_role + from o_bs_group_member membership + inner join o_gp_business gp on (gp.fk_group_id=membership.fk_group_id) +); + +create or replace view o_re_membership_v as ( + select + bmember.id as membership_id, + bmember.creationdate as creationdate, + bmember.lastmodified as lastmodified, + bmember.fk_identity_id as fk_identity_id, + bmember.g_role as g_role, + re.repositoryentry_id as fk_entry_id + from o_repositoryentry re + inner join o_re_to_group relgroup on (relgroup.fk_entry_id=re.repositoryentry_id and relgroup.r_defgroup=1) + inner join o_bs_group_member bmember on (bmember.fk_group_id=relgroup.fk_group_id) +); + +-- contacts +create view o_gp_contactkey_v as ( + select + bg_member.id as membership_id, + bg_member.fk_identity_id as member_id, + bg_member.g_role as membership_role, + bg_me.fk_identity_id as me_id, + bgroup.group_id as bg_id + from o_gp_business bgroup + inner join o_bs_group_member bg_member on (bg_member.fk_group_id = bgroup.fk_group_id) + inner join o_bs_group_member bg_me on (bg_me.fk_group_id = bgroup.fk_group_id) + where + (bgroup.ownersintern>0 and bg_member.g_role='coach') + or + (bgroup.participantsintern>0 and bg_member.g_role='participant') +); + +create view o_gp_contactext_v as ( + select + bg_member.id as membership_id, + bg_member.fk_identity_id as member_id, + bg_member.g_role as membership_role, + id_member.name as member_name, + us_member.u_firstname as member_firstname, + us_member.u_lastname as member_lastname, + bg_me.fk_identity_id as me_id, + bgroup.group_id as bg_id, + bgroup.groupname as bg_name + from o_gp_business bgroup + inner join o_bs_group_member bg_member on (bg_member.fk_group_id = bgroup.fk_group_id) + inner join o_bs_identity id_member on (bg_member.fk_identity_id = id_member.id) + inner join o_user us_member on (id_member.id = us_member.fk_identity) + inner join o_bs_group_member bg_me on (bg_me.fk_group_id = bgroup.fk_group_id) + where + (bgroup.ownersintern>0 and bg_member.g_role='coach') + or + (bgroup.participantsintern>0 and bg_member.g_role='participant') +); \ No newline at end of file diff --git a/src/main/resources/database/oracle/setupDatabase.sql b/src/main/resources/database/oracle/setupDatabase.sql index 560fa0cc9ed7fce1c39da149087c2e122866d87f..94848b6352a23bdf0781fa64d28d5df5f85c008b 100644 --- a/src/main/resources/database/oracle/setupDatabase.sql +++ b/src/main/resources/database/oracle/setupDatabase.sql @@ -54,7 +54,7 @@ CREATE TABLE o_bs_group_member ( id number(20) not null, creationdate timestamp not null, lastmodified timestamp not null, - g_role varchar2(50 char) not null, + g_role varchar2(24 char) not null, g_inheritance_mode varchar2(16 char) default 'none' not null, fk_group_id number(20) not null, fk_identity_id number(20) not null, @@ -3073,7 +3073,7 @@ alter table o_bs_group_member add constraint member_identity_ctx foreign key (fk alter table o_bs_group_member add constraint member_group_ctx foreign key (fk_group_id) references o_bs_group (id); create index member_to_identity_idx on o_bs_group_member (fk_identity_id); create index member_to_group_idx on o_bs_group_member (fk_group_id); -create index member_to_grp_role_idx on o_bs_group_member (g_role); +create index group_role_member_idx on o_bs_group_member (fk_group_id,g_role,fk_identity_id); alter table o_re_to_group add constraint re_to_group_group_ctx foreign key (fk_group_id) references o_bs_group (id); alter table o_re_to_group add constraint re_to_group_re_ctx foreign key (fk_entry_id) references o_repositoryentry (repositoryentry_id); diff --git a/src/main/resources/database/postgresql/alter_13_2_x_to_13_2_3.sql b/src/main/resources/database/postgresql/alter_13_2_x_to_13_2_3.sql new file mode 100644 index 0000000000000000000000000000000000000000..eddf3f776c833e8544ce782deb48d1eae8115d91 --- /dev/null +++ b/src/main/resources/database/postgresql/alter_13_2_x_to_13_2_3.sql @@ -0,0 +1,77 @@ +drop index if exists group_role_member_idx; +drop index if exists member_to_grp_role_idx; + +drop view if exists o_bs_gp_membership_v; +drop view if exists o_re_membership_v; +drop view if exists o_gp_contactext_v; +drop view if exists o_gp_contactkey_v; +drop view if exists o_gp_business_v; + +alter table o_bs_group_member alter column g_role type varchar(24); + +create index group_role_member_idx on o_bs_group_member (fk_group_id,g_role,fk_identity_id); + + +-- refresh views +create view o_bs_gp_membership_v as ( + select + membership.id as membership_id, + membership.fk_identity_id as fk_identity_id, + membership.lastmodified as lastmodified, + membership.creationdate as creationdate, + membership.g_role as g_role, + gp.group_id as group_id + from o_bs_group_member as membership + inner join o_gp_business as gp on (gp.fk_group_id=membership.fk_group_id) +); + +create or replace view o_re_membership_v as ( + select + bmember.id as membership_id, + bmember.creationdate as creationdate, + bmember.lastmodified as lastmodified, + bmember.fk_identity_id as fk_identity_id, + bmember.g_role as g_role, + re.repositoryentry_id as fk_entry_id + from o_repositoryentry as re + inner join o_re_to_group relgroup on (relgroup.fk_entry_id=re.repositoryentry_id and relgroup.r_defgroup=true) + inner join o_bs_group_member as bmember on (bmember.fk_group_id=relgroup.fk_group_id) +); + +create view o_gp_contactkey_v as ( + select + bg_member.id as membership_id, + bg_member.fk_identity_id as member_id, + bg_member.g_role as membership_role, + bg_me.fk_identity_id as me_id, + bgroup.group_id as bg_id + from o_gp_business as bgroup + inner join o_bs_group_member as bg_member on (bg_member.fk_group_id = bgroup.fk_group_id) + inner join o_bs_group_member as bg_me on (bg_me.fk_group_id = bgroup.fk_group_id) + where + (bgroup.ownersintern=true and bg_member.g_role='coach') + or + (bgroup.participantsintern=true and bg_member.g_role='participant') +); + +create view o_gp_contactext_v as ( + select + bg_member.id as membership_id, + bg_member.fk_identity_id as member_id, + bg_member.g_role as membership_role, + id_member.name as member_name, + us_member.u_firstname as member_firstname, + us_member.u_lastname as member_lastname, + bg_me.fk_identity_id as me_id, + bgroup.group_id as bg_id, + bgroup.groupname as bg_name + from o_gp_business as bgroup + inner join o_bs_group_member as bg_member on (bg_member.fk_group_id = bgroup.fk_group_id) + inner join o_bs_identity as id_member on (bg_member.fk_identity_id = id_member.id) + inner join o_user as us_member on (id_member.id = us_member.fk_identity) + inner join o_bs_group_member as bg_me on (bg_me.fk_group_id = bgroup.fk_group_id) + where + (bgroup.ownersintern=true and bg_member.g_role='coach') + or + (bgroup.participantsintern=true and bg_member.g_role='participant') +); \ No newline at end of file diff --git a/src/main/resources/database/postgresql/setupDatabase.sql b/src/main/resources/database/postgresql/setupDatabase.sql index 3352ab6ae2e8ac8d1b02cee3d425bcbc28f60bd1..a2f80a0f7f423ba6edd4334a7fd7b1635b3ab2cf 100644 --- a/src/main/resources/database/postgresql/setupDatabase.sql +++ b/src/main/resources/database/postgresql/setupDatabase.sql @@ -48,7 +48,7 @@ create table o_bs_group_member ( id int8 not null, creationdate timestamp not null, lastmodified timestamp not null, - g_role varchar(50) not null, + g_role varchar(24) not null, g_inheritance_mode varchar(16) default 'none' not null, fk_group_id int8 not null, fk_identity_id int8 not null, @@ -2961,7 +2961,7 @@ alter table o_bs_group_member add constraint member_identity_ctx foreign key (fk alter table o_bs_group_member add constraint member_group_ctx foreign key (fk_group_id) references o_bs_group (id); create index member_to_identity_idx on o_bs_group_member (fk_identity_id); create index member_to_group_idx on o_bs_group_member (fk_group_id); -create index member_to_grp_role_idx on o_bs_group_member (g_role); +create index group_role_member_idx on o_bs_group_member (fk_group_id,g_role,fk_identity_id); alter table o_re_to_group add constraint re_to_group_group_ctx foreign key (fk_group_id) references o_bs_group (id); alter table o_re_to_group add constraint re_to_group_re_ctx foreign key (fk_entry_id) references o_repositoryentry (repositoryentry_id); diff --git a/src/test/java/org/olat/repository/manager/RepositoryEntryAuthorQueriesTest.java b/src/test/java/org/olat/repository/manager/RepositoryEntryAuthorQueriesTest.java index 354856c9cb09ea244341c8df76dfe9a57179796a..b1bba4fa546adddd4b3d5ea68d098addc7788af4 100644 --- a/src/test/java/org/olat/repository/manager/RepositoryEntryAuthorQueriesTest.java +++ b/src/test/java/org/olat/repository/manager/RepositoryEntryAuthorQueriesTest.java @@ -395,10 +395,8 @@ public class RepositoryEntryAuthorQueriesTest extends OlatTestCase { params.addResourceTypes(reOwned.getOlatResource().getResourceableTypeName()); params.addResourceTypes(reOwned2.getOlatResource().getResourceableTypeName()); - RepositoryEntryAuthorViewResults results = repositoryEntryAuthorViewQueries.searchViews(params, 0, 1); + RepositoryEntryAuthorViewResults results = repositoryEntryAuthorViewQueries.searchViews(params, 0, -1); Assert.assertTrue(contains(reOwned, results)); - Assert.assertEquals(2, results.getViews().size()); - Assert.assertTrue(results.isComplete()); } /**