diff options
author | jmisinco | 2013-01-18 19:31:46 +0000 |
---|---|---|
committer | Roberto E. Escobar | 2013-01-18 19:37:25 +0000 |
commit | 1be9de09381c28eebb3df604ae645f3210d9474c (patch) | |
tree | 7adb1584383fcb58a4fe6e45334056788b060227 /plugins/org.eclipse.osee.orcs.rest | |
parent | 020d9bb530a0f53cc18e2be4520c8bed49fb3dcc (diff) | |
download | org.eclipse.osee-1be9de09381c28eebb3df604ae645f3210d9474c.tar.gz org.eclipse.osee-1be9de09381c28eebb3df604ae645f3210d9474c.tar.xz org.eclipse.osee-1be9de09381c28eebb3df604ae645f3210d9474c.zip |
feature[ats_L63H6]: Implement client rest search api
Change-Id: I347fdba26114f77d342df599a588fd7a2bebbe7f
Diffstat (limited to 'plugins/org.eclipse.osee.orcs.rest')
20 files changed, 256 insertions, 573 deletions
diff --git a/plugins/org.eclipse.osee.orcs.rest/META-INF/MANIFEST.MF b/plugins/org.eclipse.osee.orcs.rest/META-INF/MANIFEST.MF index 516a2f81e09..0c57b80a5b5 100644 --- a/plugins/org.eclipse.osee.orcs.rest/META-INF/MANIFEST.MF +++ b/plugins/org.eclipse.osee.orcs.rest/META-INF/MANIFEST.MF @@ -17,5 +17,7 @@ Import-Package: javax.ws.rs, org.eclipse.osee.framework.jdk.core.util, org.eclipse.osee.orcs, org.eclipse.osee.orcs.data, + org.eclipse.osee.orcs.rest.model, + org.eclipse.osee.orcs.rest.model.search, org.eclipse.osee.orcs.search Require-Bundle: org.eclipse.core.runtime diff --git a/plugins/org.eclipse.osee.orcs.rest/build.properties b/plugins/org.eclipse.osee.orcs.rest/build.properties index a3ef7214fa9..52a96646f91 100644 --- a/plugins/org.eclipse.osee.orcs.rest/build.properties +++ b/plugins/org.eclipse.osee.orcs.rest/build.properties @@ -7,4 +7,5 @@ additional.bundles = org.eclipse.osee.orcs,\ javax.ws.rs,\ org.eclipse.osee.framework.core.model,\ org.eclipse.osee.framework.core,\ - org.eclipse.osee.framework.jdk.core + org.eclipse.osee.framework.jdk.core,\ + org.eclipse.osee.orcs.rest.model diff --git a/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/ArtifactSearch_V1.java b/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/ArtifactSearch_V1.java index 81afa7838ac..00b4f41032e 100644 --- a/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/ArtifactSearch_V1.java +++ b/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/ArtifactSearch_V1.java @@ -10,22 +10,24 @@ *******************************************************************************/ package org.eclipse.osee.orcs.rest.internal.search; -import java.util.Map; +import java.util.LinkedList; +import java.util.List; +import javax.ws.rs.Consumes; import javax.ws.rs.GET; +import javax.ws.rs.POST; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Request; import javax.ws.rs.core.UriInfo; -import org.eclipse.osee.framework.core.data.IOseeBranch; -import org.eclipse.osee.framework.core.data.TokenFactory; import org.eclipse.osee.framework.core.exception.OseeCoreException; +import org.eclipse.osee.orcs.data.HasLocalId; import org.eclipse.osee.orcs.rest.internal.OrcsApplication; -import org.eclipse.osee.orcs.rest.internal.search.dsl.DslTranslatorImpl; -import org.eclipse.osee.orcs.rest.internal.search.dsl.PredicateHandlerFactory; -import org.eclipse.osee.orcs.rest.internal.search.dsl.SearchDsl; -import org.eclipse.osee.orcs.rest.internal.search.dsl.SearchDsl.DslTranslator; -import org.eclipse.osee.orcs.rest.internal.search.dsl.SearchMethod; +import org.eclipse.osee.orcs.rest.internal.search.dsl.DslFactory; +import org.eclipse.osee.orcs.rest.internal.search.dsl.DslTranslator; +import org.eclipse.osee.orcs.rest.internal.search.dsl.SearchQueryBuilder; +import org.eclipse.osee.orcs.rest.model.search.SearchParameters; +import org.eclipse.osee.orcs.rest.model.search.SearchResult; import org.eclipse.osee.orcs.search.QueryBuilder; import org.eclipse.osee.orcs.search.QueryFactory; @@ -35,15 +37,11 @@ import org.eclipse.osee.orcs.search.QueryFactory; */ public class ArtifactSearch_V1 extends ArtifactSearch { - private final SearchDsl dsl; + private final SearchQueryBuilder searchQueryBuilder; public ArtifactSearch_V1(UriInfo uriInfo, Request request, String branchUuid) { super(uriInfo, request, branchUuid); - - Map<SearchMethod, PredicateHandler> handlers = PredicateHandlerFactory.getHandlers(); - DslTranslator translator = new DslTranslatorImpl(); - // Can have a single instance of this - dsl = new SearchDsl(handlers, translator); + searchQueryBuilder = DslFactory.createQueryBuilder(); } /** @@ -102,45 +100,53 @@ public class ArtifactSearch_V1 extends ArtifactSearch { @GET @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) public SearchResult getSearchWithQueryParams(@QueryParam("alt") String alt, @QueryParam("fields") String fields, @QueryParam("q") String rawQuery, @QueryParam("fromTx") int fromTransaction, @QueryParam("inherits") boolean includeTypeInheritance, @QueryParam("cached") boolean includeCache, @QueryParam("includeDeleted") boolean includeDeleted) throws OseeCoreException { - return search(alt, fields, rawQuery, fromTransaction, includeTypeInheritance, includeCache, includeDeleted); + DslTranslator translator = DslFactory.createTranslator(); + SearchParameters params = + new SearchParameters(getBranchUuid(), translator.translate(rawQuery), alt, fields, fromTransaction, + includeTypeInheritance, includeCache, includeDeleted); + return search(params); } - // @GET - // @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) - // public SearchResult getSearchWithMatrixParams(@MatrixParam("alt") String alt, @MatrixParam("fields") String fields, @MatrixParam("q") String rawQuery, @MatrixParam("fromTx") int fromTransaction, @MatrixParam("inherits") boolean includeTypeInheritance, @MatrixParam("cached") boolean includeCache, @MatrixParam("includeDeleted") boolean includeDeleted) throws OseeCoreException { - // return search(alt, fields, rawQuery, fromTransaction, includeTypeInheritance, includeCache, includeDeleted); - // } + @POST + @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) + @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON}) + public SearchResult getSearchWithMatrixParams(SearchParameters parameters) throws OseeCoreException { + return search(parameters); + } - private SearchResult search(String alt, String fields, String rawQuery, int fromTransaction, boolean includeTypeInheritance, boolean includeCache, boolean includeDeleted) throws OseeCoreException { + private SearchResult search(SearchParameters params) throws OseeCoreException { long startTime = System.currentTimeMillis(); - IOseeBranch branch = TokenFactory.createBranch(getBranchUuid(), "searchBranch"); - QueryFactory qFactory = OrcsApplication.getOrcsApi().getQueryFactory(null); // Fix this - QueryBuilder builder = dsl.build(qFactory, branch, rawQuery); + QueryBuilder builder = searchQueryBuilder.build(qFactory, params); - builder.includeCache(includeCache); - builder.includeTypeInheritance(includeTypeInheritance); - builder.includeDeleted(includeDeleted); + builder.includeCache(params.isIncludeCache()); + builder.includeTypeInheritance(params.isIncludeTypeInheritance()); + builder.includeDeleted(params.isIncludeDeleted()); - if (fromTransaction > 0) { - builder.fromTransaction(fromTransaction); + if (params.getFromTx() > 0) { + builder.fromTransaction(params.getFromTx()); } - SearchResult result = new SearchResult(); - SearchParameters params = new SearchParameters(getBranchUuid(), rawQuery, alt, fields); - result.setPredicates(dsl.getPredicates()); - result.setSearchParams(params); - if (fields.equals("count")) { + SearchResult result; + if (params.getFields().equals("count")) { + result = new SearchResult(); int total = builder.getCount(); result.setTotal(total); + } else if (params.getFields().equals("ids")) { + List<Integer> localIds = new LinkedList<Integer>(); + for (HasLocalId art : builder.getResultsAsLocalIds()) { + localIds.add(art.getLocalId()); + } + result = new SearchResult(); + result.setIds(localIds); + result.setTotal(localIds.size()); } else { - // builder.createSearch(); - // builder.createSearchWithMatches(); throw new UnsupportedOperationException(); } + result.setSearchParams(params); result.setSearchTime(System.currentTimeMillis() - startTime); return result; } diff --git a/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/Predicate.java b/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/Predicate.java deleted file mode 100644 index cffbb3d8419..00000000000 --- a/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/Predicate.java +++ /dev/null @@ -1,101 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2012 Boeing. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Boeing - initial API and implementation - *******************************************************************************/ -package org.eclipse.osee.orcs.rest.internal.search; - -import java.util.List; -import javax.xml.bind.annotation.XmlRootElement; -import org.eclipse.osee.framework.jdk.core.util.Collections; -import org.eclipse.osee.orcs.rest.internal.search.dsl.SearchFlag; -import org.eclipse.osee.orcs.rest.internal.search.dsl.SearchMethod; -import org.eclipse.osee.orcs.rest.internal.search.dsl.SearchOp; - -/** - * @author John R. Misinco - * @author Roberto E. Escobar - */ -@XmlRootElement(name = "predicate") -public class Predicate { - private SearchMethod type; - private List<String> typeParameters; - private SearchOp op; - private List<SearchFlag> flags; - private List<String> values; - - public Predicate() { - } - - public Predicate(SearchMethod type, List<String> typeParameters, SearchOp op, List<SearchFlag> flags, List<String> values) { - this.type = type; - this.typeParameters = typeParameters; - this.op = op; - this.flags = flags; - this.values = values; - } - - public void setType(SearchMethod type) { - this.type = type; - } - - public void setTypeParameters(List<String> typeParameters) { - this.typeParameters = typeParameters; - } - - public void setOp(SearchOp op) { - this.op = op; - } - - public void setFlags(List<SearchFlag> flags) { - this.flags = flags; - } - - public void setValues(List<String> values) { - this.values = values; - } - - public SearchMethod getType() { - return type; - } - - public List<String> getTypeParameters() { - return typeParameters; - } - - public SearchOp getOp() { - return op; - } - - public List<SearchFlag> getFlags() { - return flags; - } - - public List<String> getValues() { - return values; - } - - @Override - public String toString() { - StringBuilder sb = new StringBuilder(); - sb.append("type:["); - sb.append(type); - sb.append("],typeParameters:["); - sb.append(Collections.toString(",", typeParameters)); - sb.append("],"); - sb.append("op:["); - sb.append(op); - sb.append("],flags:["); - sb.append(Collections.toString(",", flags)); - sb.append("],values:["); - sb.append(Collections.toString(",", values)); - sb.append("]"); - return sb.toString(); - } - -}
\ No newline at end of file diff --git a/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/PredicateHandler.java b/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/PredicateHandler.java index 6b25cdbb664..e807620bacb 100644 --- a/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/PredicateHandler.java +++ b/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/PredicateHandler.java @@ -11,6 +11,7 @@ package org.eclipse.osee.orcs.rest.internal.search; import org.eclipse.osee.framework.core.exception.OseeCoreException; +import org.eclipse.osee.orcs.rest.model.search.Predicate; import org.eclipse.osee.orcs.search.QueryBuilder; /** diff --git a/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/SearchParameters.java b/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/SearchParameters.java deleted file mode 100644 index cdbf24f8cce..00000000000 --- a/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/SearchParameters.java +++ /dev/null @@ -1,67 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2012 Boeing. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Boeing - initial API and implementation - *******************************************************************************/ -package org.eclipse.osee.orcs.rest.internal.search; - -/** - * @author John R. Misinco - * @author Roberto E. Escobar - */ -public class SearchParameters { - - private String branchUuid; - private String query; - private String alt; - private String fields; - - public SearchParameters() { - - } - - public SearchParameters(String uuid, String query, String alt, String fields) { - this.branchUuid = uuid; - this.query = query; - this.alt = alt; - this.fields = fields; - } - - public String getBranchUuid() { - return branchUuid; - } - - public String getQuery() { - return query; - } - - public String getAlt() { - return alt; - } - - public String getFields() { - return fields; - } - - public void setBranchUuid(String uuid) { - this.branchUuid = uuid; - } - - public void setQuery(String query) { - this.query = query; - } - - public void setAlt(String alt) { - this.alt = alt; - } - - public void setFields(String fields) { - this.fields = fields; - } - -} diff --git a/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/SearchResult.java b/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/SearchResult.java deleted file mode 100644 index 4e05edefad6..00000000000 --- a/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/SearchResult.java +++ /dev/null @@ -1,83 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2012 Boeing. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Boeing - initial API and implementation - *******************************************************************************/ -package org.eclipse.osee.orcs.rest.internal.search; - -import java.util.List; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlElementWrapper; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlTransient; - -/** - * @author John R. Misinco - * @author Roberto E. Escobar - */ -@XmlRootElement -public class SearchResult { - - // All else from out message - - private int total; - private long searchTime; - private String version; - - private SearchParameters searchParameters; - - @XmlTransient - private List<Predicate> predicates; - - public SearchParameters getSearchParams() { - return searchParameters; - } - - public void setSearchParams(SearchParameters searchParams) { - this.searchParameters = searchParams; - } - - public void setPredicates(List<Predicate> predicates) { - this.predicates = predicates; - } - - public void setVersion(String version) { - this.version = version; - } - - public void setTotal(int total) { - this.total = total; - } - - public void setSearchTime(long searchTime) { - this.searchTime = searchTime; - } - - public int getTotal() { - return total; - } - - public long getSearchTime() { - return searchTime; - } - - public String getVersion() { - return version; - } - - @XmlElementWrapper(name = "predicates") - @XmlElement(name = "predicate") - public List<Predicate> getPredicates() { - return predicates; - } - - public SearchParameters getSearchParameters() { - return searchParameters; - } - -} diff --git a/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/dsl/PredicateHandlerFactory.java b/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/dsl/DslFactory.java index 40470116c19..d15fdb73051 100644 --- a/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/dsl/PredicateHandlerFactory.java +++ b/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/dsl/DslFactory.java @@ -17,12 +17,27 @@ import org.eclipse.osee.orcs.rest.internal.search.predicate.AttributeTypePredica import org.eclipse.osee.orcs.rest.internal.search.predicate.ExistsTypePredicateHandler; import org.eclipse.osee.orcs.rest.internal.search.predicate.IdsPredicateHandler; import org.eclipse.osee.orcs.rest.internal.search.predicate.IsOfTypePredicateHandler; +import org.eclipse.osee.orcs.rest.model.search.SearchMethod; /** * @author John R. Misinco * @author Roberto E. Escobar */ -public class PredicateHandlerFactory { +public class DslFactory { + + private static SearchQueryBuilder builder; + + public synchronized static SearchQueryBuilder createQueryBuilder() { + if (builder == null) { + Map<SearchMethod, PredicateHandler> handlers = DslFactory.getHandlers(); + builder = new SearchQueryBuilder(handlers); + } + return builder; + } + + public static DslTranslator createTranslator() { + return new DslTranslatorImpl_V1(); + } public static Map<SearchMethod, PredicateHandler> getHandlers() { Map<SearchMethod, PredicateHandler> handlers = new HashMap<SearchMethod, PredicateHandler>(); diff --git a/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/dsl/DslTranslator.java b/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/dsl/DslTranslator.java new file mode 100644 index 00000000000..3232bd67502 --- /dev/null +++ b/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/dsl/DslTranslator.java @@ -0,0 +1,24 @@ +/******************************************************************************* + * Copyright (c) 2012 Boeing. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Boeing - initial API and implementation + *******************************************************************************/ +package org.eclipse.osee.orcs.rest.internal.search.dsl; + +import java.util.List; +import org.eclipse.osee.framework.core.exception.OseeCoreException; +import org.eclipse.osee.orcs.rest.model.search.Predicate; + +/** + * @author John R. Misinco + */ +public interface DslTranslator { + + List<Predicate> translate(String rawString) throws OseeCoreException; + +} diff --git a/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/dsl/DslTranslatorImpl.java b/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/dsl/DslTranslatorImpl_V1.java index 32a424023b5..ae7984191d5 100644 --- a/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/dsl/DslTranslatorImpl.java +++ b/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/dsl/DslTranslatorImpl_V1.java @@ -13,62 +13,70 @@ package org.eclipse.osee.orcs.rest.internal.search.dsl; import java.util.Arrays; import java.util.LinkedList; import java.util.List; +import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; import org.eclipse.osee.framework.core.exception.OseeCoreException; import org.eclipse.osee.framework.jdk.core.util.Strings; -import org.eclipse.osee.orcs.rest.internal.search.Predicate; -import org.eclipse.osee.orcs.rest.internal.search.dsl.SearchDsl.DslTranslator; +import org.eclipse.osee.orcs.rest.model.search.Predicate; +import org.eclipse.osee.orcs.rest.model.search.SearchFlag; +import org.eclipse.osee.orcs.rest.model.search.SearchMethod; +import org.eclipse.osee.orcs.rest.model.search.SearchOp; /** * @author John R. Misinco * @author Roberto E. Escobar */ -public class DslTranslatorImpl implements DslTranslator { +public class DslTranslatorImpl_V1 implements DslTranslator { private static final String ARGUMENT_REGEX = ":([^&\\]]+)"; - private static final Pattern queryPattern = Pattern.compile("(\\[[^\\]]+\\])"); + private static final Pattern queryPattern = Pattern.compile("\\]&\\["); private static final Pattern typePattern = Pattern.compile("t" + ARGUMENT_REGEX); private static final Pattern typeParametersPattern = Pattern.compile("tp" + ARGUMENT_REGEX); private static final Pattern opPattern = Pattern.compile("op" + ARGUMENT_REGEX); private static final Pattern flagsPattern = Pattern.compile("f" + ARGUMENT_REGEX); private static final Pattern valuePattern = Pattern.compile("v" + ARGUMENT_REGEX); + private static final Pattern delimiterPattern = Pattern.compile("d:'(.+)'"); - private final Matcher queryMatcher, typeMatcher, opMatcher, flagsMatcher, valueMatcher, typeParametersMatcher; + private final Matcher typeMatcher, opMatcher, flagsMatcher, valueMatcher, typeParametersMatcher, delimiterMatcher; + private Scanner scanner; - public DslTranslatorImpl() { - queryMatcher = queryPattern.matcher(""); + public DslTranslatorImpl_V1() { typeMatcher = typePattern.matcher(""); opMatcher = opPattern.matcher(""); flagsMatcher = flagsPattern.matcher(""); valueMatcher = valuePattern.matcher(""); typeParametersMatcher = typeParametersPattern.matcher(""); + delimiterMatcher = delimiterPattern.matcher(""); } @Override public List<Predicate> translate(String rawString) throws OseeCoreException { List<Predicate> predicates = new LinkedList<Predicate>(); - queryMatcher.reset(rawString); - while (queryMatcher.find()) { - String queryBlock = queryMatcher.group(1); + scanner = new Scanner(rawString); + scanner.useDelimiter(queryPattern); + while (scanner.hasNext()) { + String queryBlock = scanner.next(); typeMatcher.reset(queryBlock); typeParametersMatcher.reset(queryBlock); opMatcher.reset(queryBlock); flagsMatcher.reset(queryBlock); valueMatcher.reset(queryBlock); + delimiterMatcher.reset(queryBlock); String type = getMatch(typeMatcher); String typeParams = getMatch(typeParametersMatcher); String op = getMatch(opMatcher); String flags = getMatch(flagsMatcher); String value = getMatch(valueMatcher); + String delimiter = getMatch(delimiterMatcher); - predicates.add(createPredicate(type, typeParams, op, flags, value)); + predicates.add(createPredicate(type, typeParams, op, flags, delimiter, value)); } return predicates; } - private Predicate createPredicate(String type, String typeParameters, String op, String flags, String value) throws OseeCoreException { + private Predicate createPredicate(String type, String typeParameters, String op, String flags, String delimiter, String value) throws OseeCoreException { SearchMethod searchMethod = SearchMethod.fromString(type); SearchOp searchOp = SearchOp.fromString(op); @@ -81,14 +89,14 @@ public class DslTranslatorImpl implements DslTranslator { List<String> values = Arrays.asList(value.split(",\\s*")); List<String> typeParams = Arrays.asList(typeParameters.split(",\\s*")); - return new Predicate(searchMethod, typeParams, searchOp, searchFlags, values); + return new Predicate(searchMethod, typeParams, searchOp, searchFlags, delimiter, values); } private String getMatch(Matcher m) { if (m.find()) { return m.group(1); } - return ""; + return Strings.EMPTY_STRING; } } diff --git a/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/dsl/SearchFlag.java b/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/dsl/SearchFlag.java deleted file mode 100644 index 9b9ebc8632b..00000000000 --- a/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/dsl/SearchFlag.java +++ /dev/null @@ -1,49 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2012 Boeing. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Boeing - initial API and implementation - *******************************************************************************/ -package org.eclipse.osee.orcs.rest.internal.search.dsl; - -import org.eclipse.osee.framework.core.exception.OseeCoreException; -import org.eclipse.osee.framework.core.util.Conditions; - -/** - * @author John R. Misinco - * @author Roberto E. Escobar - */ -public enum SearchFlag { - TOKENIZED("t"), - IGNORE_CASE("i"), - MATCH_CASE("m"), - TOKENIZED_ANY("t_any"), - TOKENIZED_ORDERED("t_ordered"), - INCLUDE_TYPE_INHERITANCE("iti"); - - private final String token; - - private SearchFlag(String token) { - this.token = token; - } - - public String getToken() { - return token; - } - - public static SearchFlag fromString(String value) throws OseeCoreException { - SearchFlag toReturn = null; - for (SearchFlag op : SearchFlag.values()) { - if (op.getToken().equals(value)) { - toReturn = op; - break; - } - } - Conditions.checkNotNull(toReturn, "SearchFlag", "Invalid flag [%s]", value); - return toReturn; - } -}
\ No newline at end of file diff --git a/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/dsl/SearchMethod.java b/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/dsl/SearchMethod.java deleted file mode 100644 index 9a516a9f7c2..00000000000 --- a/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/dsl/SearchMethod.java +++ /dev/null @@ -1,46 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2012 Boeing. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Boeing - initial API and implementation - *******************************************************************************/ -package org.eclipse.osee.orcs.rest.internal.search.dsl; - -import org.eclipse.osee.framework.core.exception.OseeCoreException; -import org.eclipse.osee.framework.core.util.Conditions; - -/** - * @author John R. Misinco - * @author Roberto E. Escobar - */ -public enum SearchMethod { - IDS("ids"), - IS_OF_TYPE("isOfType"), - EXISTS_TYPE("exists"), - ATTRIBUTE_TYPE("attrType"); - - private final String token; - - private SearchMethod(String token) { - this.token = token; - } - - public String getToken() { - return token; - } - - public static SearchMethod fromString(String value) throws OseeCoreException { - SearchMethod toReturn = null; - for (SearchMethod op : SearchMethod.values()) { - if (op.getToken().equals(value)) { - toReturn = op; - } - } - Conditions.checkNotNull(toReturn, "SearchMethod", "Invalid type [%s]", value); - return toReturn; - } -}
\ No newline at end of file diff --git a/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/dsl/SearchOp.java b/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/dsl/SearchOp.java deleted file mode 100644 index 34d9f533bf2..00000000000 --- a/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/dsl/SearchOp.java +++ /dev/null @@ -1,47 +0,0 @@ -/******************************************************************************* - * Copyright (c) 2012 Boeing. - * All rights reserved. This program and the accompanying materials - * are made available under the terms of the Eclipse Public License v1.0 - * which accompanies this distribution, and is available at - * http://www.eclipse.org/legal/epl-v10.html - * - * Contributors: - * Boeing - initial API and implementation - *******************************************************************************/ -package org.eclipse.osee.orcs.rest.internal.search.dsl; - -import org.eclipse.osee.framework.core.exception.OseeCoreException; -import org.eclipse.osee.framework.core.util.Conditions; - -/** - * @author John R. Misinco - * @author Roberto E. Escobar - */ -public enum SearchOp { - EQUALS("=="), - NOT_EQUALS("!="), - LESS_THAN("<"), - GREATER_THAN(">"), - IN("in"); - - private final String token; - - private SearchOp(String token) { - this.token = token; - } - - public String getToken() { - return token; - } - - public static SearchOp fromString(String value) throws OseeCoreException { - SearchOp toReturn = null; - for (SearchOp op : SearchOp.values()) { - if (op.getToken().equals(value)) { - toReturn = op; - } - } - Conditions.checkNotNull(toReturn, "searchOp", "Invalid op [%s]", value); - return toReturn; - } -}
\ No newline at end of file diff --git a/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/dsl/SearchDsl.java b/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/dsl/SearchQueryBuilder.java index 884a15a728b..e97d74ed782 100644 --- a/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/dsl/SearchDsl.java +++ b/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/dsl/SearchQueryBuilder.java @@ -13,10 +13,13 @@ package org.eclipse.osee.orcs.rest.internal.search.dsl; import java.util.List; import java.util.Map; import org.eclipse.osee.framework.core.data.IOseeBranch; +import org.eclipse.osee.framework.core.data.TokenFactory; import org.eclipse.osee.framework.core.exception.OseeCoreException; import org.eclipse.osee.framework.core.util.Conditions; -import org.eclipse.osee.orcs.rest.internal.search.Predicate; import org.eclipse.osee.orcs.rest.internal.search.PredicateHandler; +import org.eclipse.osee.orcs.rest.model.search.Predicate; +import org.eclipse.osee.orcs.rest.model.search.SearchMethod; +import org.eclipse.osee.orcs.rest.model.search.SearchParameters; import org.eclipse.osee.orcs.search.QueryBuilder; import org.eclipse.osee.orcs.search.QueryFactory; @@ -24,41 +27,30 @@ import org.eclipse.osee.orcs.search.QueryFactory; * @author John R. Misinco * @author Roberto E. Escobar */ -public class SearchDsl { - - public static interface DslTranslator { - - List<Predicate> translate(String rawString) throws OseeCoreException; - - } +public class SearchQueryBuilder { private final Map<SearchMethod, PredicateHandler> handlers; - private final DslTranslator translator; - private List<Predicate> predicates; - public SearchDsl(Map<SearchMethod, PredicateHandler> handlers, DslTranslator translator) { + public SearchQueryBuilder(Map<SearchMethod, PredicateHandler> handlers) { this.handlers = handlers; - this.translator = translator; } - public QueryBuilder build(QueryFactory queryFactory, IOseeBranch branch, String rawQuery) throws OseeCoreException { + public QueryBuilder build(QueryFactory queryFactory, SearchParameters params) throws OseeCoreException { Conditions.checkNotNull(queryFactory, "queryFactory"); - Conditions.checkNotNull(branch, "branch"); - Conditions.checkNotNull(rawQuery, "rawQuery"); - predicates = translator.translate(rawQuery); - QueryBuilder builder = queryFactory.fromBranch(branch); - for (Predicate predicate : predicates) { - SearchMethod method = predicate.getType(); - if (handlers.containsKey(method)) { + Conditions.checkNotNull(params, "params"); + IOseeBranch searchBranch = TokenFactory.createBranch(params.getBranchUuid(), "searchBranch"); + QueryBuilder builder = queryFactory.fromBranch(searchBranch); + List<Predicate> predicates = params.getPredicates(); + if (predicates != null) { + for (Predicate predicate : predicates) { + SearchMethod method = predicate.getType(); PredicateHandler handler = handlers.get(method); - builder = handler.handle(builder, predicate); + if (handler != null) { + builder = handler.handle(builder, predicate); + } } } return builder; } - public List<Predicate> getPredicates() { - return predicates; - } - } diff --git a/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/predicate/AttributeTypePredicateHandler.java b/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/predicate/AttributeTypePredicateHandler.java index 87c4f8b0d8d..9608d5b67e2 100644 --- a/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/predicate/AttributeTypePredicateHandler.java +++ b/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/predicate/AttributeTypePredicateHandler.java @@ -14,18 +14,20 @@ import java.util.Collection; import java.util.Collections; import java.util.List; import org.eclipse.osee.framework.core.data.IAttributeType; +import org.eclipse.osee.framework.core.enums.CaseType; +import org.eclipse.osee.framework.core.enums.MatchTokenCountType; +import org.eclipse.osee.framework.core.enums.Operator; +import org.eclipse.osee.framework.core.enums.TokenDelimiterMatch; +import org.eclipse.osee.framework.core.enums.TokenOrderType; import org.eclipse.osee.framework.core.exception.OseeArgumentException; import org.eclipse.osee.framework.core.exception.OseeCoreException; import org.eclipse.osee.framework.core.util.Conditions; -import org.eclipse.osee.orcs.rest.internal.search.Predicate; import org.eclipse.osee.orcs.rest.internal.search.PredicateHandler; -import org.eclipse.osee.orcs.rest.internal.search.dsl.SearchFlag; -import org.eclipse.osee.orcs.rest.internal.search.dsl.SearchMethod; -import org.eclipse.osee.orcs.rest.internal.search.dsl.SearchOp; -import org.eclipse.osee.orcs.search.CaseType; -import org.eclipse.osee.orcs.search.Operator; +import org.eclipse.osee.orcs.rest.model.search.Predicate; +import org.eclipse.osee.orcs.rest.model.search.SearchFlag; +import org.eclipse.osee.orcs.rest.model.search.SearchMethod; +import org.eclipse.osee.orcs.rest.model.search.SearchOp; import org.eclipse.osee.orcs.search.QueryBuilder; -import org.eclipse.osee.orcs.search.StringOperator; /** * @author John R. Misinco @@ -42,40 +44,31 @@ public class AttributeTypePredicateHandler implements PredicateHandler { List<String> typeParameters = predicate.getTypeParameters(); Collection<IAttributeType> attributeTypes = PredicateHandlerUtil.getIAttributeTypes(typeParameters); SearchOp op = predicate.getOp(); - List<String> values = predicate.getValues(); + Collection<String> values = predicate.getValues(); Conditions.checkNotNull(values, "values"); - if (isAttributeTokenSearch(op, flags) && !containsAny(Collections.singleton(op), SearchOp.GREATER_THAN, - SearchOp.LESS_THAN)) { - StringOperator operator = getStringOperator(op, flags); - Conditions.checkNotNull(operator, "string operator", - "Query error - cannot determine string operator from [%s]:[%s]", op, flags); + if (!containsAny(Collections.singleton(op), SearchOp.GREATER_THAN, SearchOp.LESS_THAN)) { CaseType ct = getCaseType(flags); - for (String value : values) { - builder = and(builder, attributeTypes, operator, ct, value); + TokenOrderType orderType = getTokenOrderType(flags); + MatchTokenCountType countType = getMatchTokenCountType(flags); + if (values.size() == 1) { + builder = + builder.and(attributeTypes, values.iterator().next(), + TokenDelimiterMatch.custom(predicate.getDelimiter()), ct, orderType, countType); + } else { + for (IAttributeType type : attributeTypes) { + builder = builder.and(type, getOperator(op), values); + } } } else { Operator operator = getOperator(op); for (IAttributeType type : attributeTypes) { - builder = and(builder, type, operator, values); + builder = builder.and(type, operator, values); } } return builder; } - protected QueryBuilder and(QueryBuilder builder, Collection<IAttributeType> attributeTypes, StringOperator operator, CaseType ct, String value) throws OseeCoreException { - return builder.and(attributeTypes, operator, ct, value); - } - - protected QueryBuilder and(QueryBuilder builder, IAttributeType type, Operator operator, List<String> values) throws OseeCoreException { - return builder.and(type, operator, values); - } - - private boolean isAttributeTokenSearch(SearchOp op, List<SearchFlag> flags) { - return containsAny(flags, SearchFlag.TOKENIZED, SearchFlag.TOKENIZED_ANY, SearchFlag.TOKENIZED_ORDERED, - SearchFlag.IGNORE_CASE) || containsAny(Collections.singleton(op), SearchOp.IN); - } - private boolean containsAny(Collection<?> data, Object... values) { boolean result = false; for (Object object : values) { @@ -88,43 +81,24 @@ public class AttributeTypePredicateHandler implements PredicateHandler { } private CaseType getCaseType(List<SearchFlag> flags) { - if (flags.contains(SearchFlag.MATCH_CASE)) { + if (flags != null && flags.contains(SearchFlag.MATCH_CASE)) { return CaseType.MATCH_CASE; } return CaseType.IGNORE_CASE; } - // EQUALS(), // Exact Match as in Strings.equals - // NOT_EQUALS(), // inverse of exact match - !Strings.equals - // CONTAINS, - // TOKENIZED_ANY_ORDER, - // TOKENIZED_MATCH_ORDER - - private StringOperator getStringOperator(SearchOp op, List<SearchFlag> flags) { - StringOperator toReturn; - - if (flags.contains(SearchFlag.TOKENIZED_ANY)) { - toReturn = StringOperator.TOKENIZED_ANY_ORDER; - } else if (flags.contains(SearchFlag.TOKENIZED_ORDERED)) { - toReturn = StringOperator.TOKENIZED_MATCH_ORDER; - } else { - switch (op) { - case EQUALS: - toReturn = StringOperator.EQUALS; - break; - case NOT_EQUALS: - toReturn = StringOperator.NOT_EQUALS; - break; - case IN: - toReturn = StringOperator.CONTAINS; - break; - default: - toReturn = null; - break; + private TokenOrderType getTokenOrderType(List<SearchFlag> flags) { + if (flags != null && flags.contains(SearchFlag.MATCH_TOKEN_ORDER)) { + return TokenOrderType.MATCH_ORDER; + } + return TokenOrderType.ANY_ORDER; + } - } + private MatchTokenCountType getMatchTokenCountType(List<SearchFlag> flags) { + if (flags != null && flags.contains(SearchFlag.MATCH_TOKEN_COUNT)) { + return MatchTokenCountType.MATCH_TOKEN_COUNT; } - return toReturn; + return MatchTokenCountType.IGNORE_TOKEN_COUNT; } // EQUAL("="), // Exact Match as in Strings.equals @@ -138,9 +112,6 @@ public class AttributeTypePredicateHandler implements PredicateHandler { if (op.equals(SearchOp.LESS_THAN)) { return Operator.LESS_THAN; } - if (op.equals(SearchOp.NOT_EQUALS)) { - return Operator.NOT_EQUAL; - } return Operator.EQUAL; } diff --git a/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/predicate/ExistsTypePredicateHandler.java b/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/predicate/ExistsTypePredicateHandler.java index 731d9f44c98..04c20b2cdee 100644 --- a/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/predicate/ExistsTypePredicateHandler.java +++ b/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/predicate/ExistsTypePredicateHandler.java @@ -13,13 +13,13 @@ package org.eclipse.osee.orcs.rest.internal.search.predicate; import java.util.Collection; import java.util.List; import org.eclipse.osee.framework.core.data.IAttributeType; -import org.eclipse.osee.framework.core.data.IRelationTypeSide; +import org.eclipse.osee.framework.core.data.IRelationType; import org.eclipse.osee.framework.core.exception.OseeArgumentException; import org.eclipse.osee.framework.core.exception.OseeCoreException; import org.eclipse.osee.framework.core.util.Conditions; -import org.eclipse.osee.orcs.rest.internal.search.Predicate; import org.eclipse.osee.orcs.rest.internal.search.PredicateHandler; -import org.eclipse.osee.orcs.rest.internal.search.dsl.SearchMethod; +import org.eclipse.osee.orcs.rest.model.search.Predicate; +import org.eclipse.osee.orcs.rest.model.search.SearchMethod; import org.eclipse.osee.orcs.search.QueryBuilder; /** @@ -34,7 +34,7 @@ public class ExistsTypePredicateHandler implements PredicateHandler { throw new OseeArgumentException("This predicate handler only supports [%s]", SearchMethod.EXISTS_TYPE); } List<String> typeParameters = predicate.getTypeParameters(); - List<String> values = predicate.getValues(); + Collection<String> values = predicate.getValues(); Conditions.checkNotNull(typeParameters, "typeParameters"); Conditions.checkNotNull(values, "values"); @@ -43,24 +43,17 @@ public class ExistsTypePredicateHandler implements PredicateHandler { String existsType = typeParameters.get(0); if ("attrType".equals(existsType)) { Collection<IAttributeType> attributeTypes = PredicateHandlerUtil.getIAttributeTypes(values); - builder = andAttrTypesExists(builder, attributeTypes); + if (!attributeTypes.isEmpty()) { + builder.andExists(attributeTypes); + } } else if ("relType".equals(existsType)) { - Collection<IRelationTypeSide> relations = PredicateHandlerUtil.getIRelationTypeSides(values); - builder = andRelTypeSideExists(builder, relations); + for (IRelationType rt : PredicateHandlerUtil.getIRelationTypes(values)) { + builder.andExists(rt); + } } } return builder; } - protected QueryBuilder andRelTypeSideExists(QueryBuilder builder, Collection<IRelationTypeSide> relations) throws OseeCoreException { - for (IRelationTypeSide rts : relations) { - builder = builder.andExists(rts); - } - return builder; - } - - protected QueryBuilder andAttrTypesExists(QueryBuilder builder, Collection<IAttributeType> attributeTypes) throws OseeCoreException { - return builder.andExists(attributeTypes); - } } diff --git a/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/predicate/IdsPredicateHandler.java b/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/predicate/IdsPredicateHandler.java index 2794283563a..e5b2001d196 100644 --- a/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/predicate/IdsPredicateHandler.java +++ b/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/predicate/IdsPredicateHandler.java @@ -12,13 +12,12 @@ package org.eclipse.osee.orcs.rest.internal.search.predicate; import java.util.Collection; import java.util.HashSet; -import java.util.List; import org.eclipse.osee.framework.core.exception.OseeArgumentException; import org.eclipse.osee.framework.core.exception.OseeCoreException; import org.eclipse.osee.framework.core.util.Conditions; -import org.eclipse.osee.orcs.rest.internal.search.Predicate; import org.eclipse.osee.orcs.rest.internal.search.PredicateHandler; -import org.eclipse.osee.orcs.rest.internal.search.dsl.SearchMethod; +import org.eclipse.osee.orcs.rest.model.search.Predicate; +import org.eclipse.osee.orcs.rest.model.search.SearchMethod; import org.eclipse.osee.orcs.search.QueryBuilder; /** @@ -32,8 +31,7 @@ public class IdsPredicateHandler implements PredicateHandler { if (predicate.getType() != SearchMethod.IDS) { throw new OseeArgumentException("This predicate handler only supports [%s]", SearchMethod.IDS); } - QueryBuilder theBuilder = builder; - List<String> values = predicate.getValues(); + Collection<String> values = predicate.getValues(); Conditions.checkNotNull(values, "values"); @@ -48,20 +46,13 @@ public class IdsPredicateHandler implements PredicateHandler { } if (!guids.isEmpty()) { - theBuilder = addGuids(builder, guids); + builder.andGuidsOrHrids(guids); } if (!rawIds.isEmpty()) { - theBuilder = addIds(builder, rawIds); + builder.andLocalIds(rawIds); } - return theBuilder; + return builder; } - protected QueryBuilder addGuids(QueryBuilder builder, Collection<String> guids) throws OseeCoreException { - return builder.andGuidsOrHrids(guids); - } - - protected QueryBuilder addIds(QueryBuilder builder, Collection<Integer> rawIds) throws OseeCoreException { - return builder.andLocalIds(rawIds); - } } diff --git a/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/predicate/IsOfTypePredicateHandler.java b/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/predicate/IsOfTypePredicateHandler.java index 13b96179bec..2d04869ed44 100644 --- a/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/predicate/IsOfTypePredicateHandler.java +++ b/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/predicate/IsOfTypePredicateHandler.java @@ -11,14 +11,13 @@ package org.eclipse.osee.orcs.rest.internal.search.predicate; import java.util.Collection; -import java.util.List; import org.eclipse.osee.framework.core.data.IArtifactType; import org.eclipse.osee.framework.core.exception.OseeArgumentException; import org.eclipse.osee.framework.core.exception.OseeCoreException; import org.eclipse.osee.framework.core.util.Conditions; -import org.eclipse.osee.orcs.rest.internal.search.Predicate; import org.eclipse.osee.orcs.rest.internal.search.PredicateHandler; -import org.eclipse.osee.orcs.rest.internal.search.dsl.SearchMethod; +import org.eclipse.osee.orcs.rest.model.search.Predicate; +import org.eclipse.osee.orcs.rest.model.search.SearchMethod; import org.eclipse.osee.orcs.search.QueryBuilder; /** @@ -32,10 +31,12 @@ public class IsOfTypePredicateHandler implements PredicateHandler { if (predicate.getType() != SearchMethod.IS_OF_TYPE) { throw new OseeArgumentException("This predicate handler only supports [%s]", SearchMethod.IS_OF_TYPE); } - List<String> values = predicate.getValues(); + Collection<String> values = predicate.getValues(); Conditions.checkNotNull(values, "values"); Collection<IArtifactType> artTypes = PredicateHandlerUtil.getIArtifactTypes(values); - builder = andIsOfType(builder, artTypes); + if (!artTypes.isEmpty()) { + builder.andIsOfType(artTypes); + } return builder; } diff --git a/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/predicate/PredicateHandlerUtil.java b/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/predicate/PredicateHandlerUtil.java index 289f4d58d42..7baab311f5d 100644 --- a/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/predicate/PredicateHandlerUtil.java +++ b/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/predicate/PredicateHandlerUtil.java @@ -12,9 +12,9 @@ package org.eclipse.osee.orcs.rest.internal.search.predicate; import java.util.Collection; import java.util.HashSet; -import java.util.List; import org.eclipse.osee.framework.core.data.IArtifactType; import org.eclipse.osee.framework.core.data.IAttributeType; +import org.eclipse.osee.framework.core.data.IRelationType; import org.eclipse.osee.framework.core.data.IRelationTypeSide; import org.eclipse.osee.framework.core.data.TokenFactory; import org.eclipse.osee.framework.core.enums.RelationSide; @@ -27,7 +27,7 @@ import org.eclipse.osee.framework.core.util.HexUtil; */ public class PredicateHandlerUtil { - public static Collection<IAttributeType> getIAttributeTypes(List<String> types) throws OseeCoreException { + public static Collection<IAttributeType> getIAttributeTypes(Collection<String> types) throws OseeCoreException { Collection<IAttributeType> attrTypes = new HashSet<IAttributeType>(); for (String value : types) { long uuid = parseUuid(value); @@ -38,7 +38,7 @@ public class PredicateHandlerUtil { return attrTypes; } - public static Collection<IArtifactType> getIArtifactTypes(List<String> types) throws OseeCoreException { + public static Collection<IArtifactType> getIArtifactTypes(Collection<String> types) throws OseeCoreException { Collection<IArtifactType> artTypes = new HashSet<IArtifactType>(); for (String value : types) { long uuid = parseUuid(value); @@ -49,7 +49,18 @@ public class PredicateHandlerUtil { return artTypes; } - public static Collection<IRelationTypeSide> getIRelationTypeSides(List<String> rels) throws OseeCoreException { + public static Collection<IRelationType> getIRelationTypes(Collection<String> rels) throws OseeCoreException { + Collection<IRelationType> types = new HashSet<IRelationType>(); + for (String value : rels) { + long longUuid = parseUuid(value); + if (longUuid != -1L) { + types.add(TokenFactory.createRelationType(longUuid, "SearchRelationType")); + } + } + return types; + } + + public static Collection<IRelationTypeSide> getIRelationTypeSides(Collection<String> rels) throws OseeCoreException { Collection<IRelationTypeSide> relSides = new HashSet<IRelationTypeSide>(); for (String value : rels) { char sideChar = value.charAt(0); diff --git a/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/predicate/RelatedToPredicateHandler.java b/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/predicate/RelatedToPredicateHandler.java new file mode 100644 index 00000000000..67113005efb --- /dev/null +++ b/plugins/org.eclipse.osee.orcs.rest/src/org/eclipse/osee/orcs/rest/internal/search/predicate/RelatedToPredicateHandler.java @@ -0,0 +1,60 @@ +/******************************************************************************* + * Copyright (c) 2012 Boeing. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Boeing - initial API and implementation + *******************************************************************************/ +package org.eclipse.osee.orcs.rest.internal.search.predicate; + +import java.util.Collection; +import java.util.LinkedList; +import java.util.List; +import org.eclipse.osee.framework.core.data.IRelationTypeSide; +import org.eclipse.osee.framework.core.exception.OseeArgumentException; +import org.eclipse.osee.framework.core.exception.OseeCoreException; +import org.eclipse.osee.framework.core.util.Conditions; +import org.eclipse.osee.framework.jdk.core.util.GUID; +import org.eclipse.osee.orcs.rest.internal.search.PredicateHandler; +import org.eclipse.osee.orcs.rest.model.search.Predicate; +import org.eclipse.osee.orcs.rest.model.search.SearchMethod; +import org.eclipse.osee.orcs.search.QueryBuilder; + +/** + * @author John Misinco + */ +public class RelatedToPredicateHandler implements PredicateHandler { + + @Override + public QueryBuilder handle(QueryBuilder builder, Predicate predicate) throws OseeCoreException { + if (predicate.getType() != SearchMethod.RELATED_TO) { + throw new OseeArgumentException("This predicate handler only supports [%s]", SearchMethod.EXISTS_TYPE); + } + List<String> typeParameters = predicate.getTypeParameters(); + Collection<String> values = predicate.getValues(); + + Conditions.checkNotNull(typeParameters, "typeParameters"); + Conditions.checkNotNull(values, "values"); + + Collection<IRelationTypeSide> types = PredicateHandlerUtil.getIRelationTypeSides(typeParameters); + Collection<Integer> localIds = new LinkedList<Integer>(); + + for (String value : values) { + if (GUID.isValid(value)) { + throw new UnsupportedOperationException(); + } else { + localIds.add(Integer.parseInt(value)); + } + } + + if (!localIds.isEmpty()) { + for (IRelationTypeSide rts : types) { + builder.andRelatedToLocalIds(rts, localIds); + } + } + return builder; + } +} |