From e023733cf04d6cff7e980062f46a4867d4cd721e Mon Sep 17 00:00:00 2001 From: Robert von Burg Date: Sat, 1 Feb 2014 13:12:43 +0100 Subject: [PATCH] [New] Added NotSelection and further builder methods to StrolchQuery --- .../li/strolch/model/query/AndSelection.java | 1 + .../strolch/model/query/BooleanSelection.java | 12 ++++- .../li/strolch/model/query/IdSelection.java | 42 +++++++++++++++-- .../li/strolch/model/query/NotSelection.java | 47 +++++++++++++++++++ .../li/strolch/model/query/QueryVisitor.java | 2 + .../li/strolch/model/query/StrolchQuery.java | 23 +++++++++ 6 files changed, 120 insertions(+), 7 deletions(-) create mode 100644 src/main/java/li/strolch/model/query/NotSelection.java diff --git a/src/main/java/li/strolch/model/query/AndSelection.java b/src/main/java/li/strolch/model/query/AndSelection.java index 8f0c70bb6..77c480921 100644 --- a/src/main/java/li/strolch/model/query/AndSelection.java +++ b/src/main/java/li/strolch/model/query/AndSelection.java @@ -44,6 +44,7 @@ public class AndSelection extends BooleanSelection { return this; } + @Override public void accept(QueryVisitor visitor) { visitor.visitAnd(this); } diff --git a/src/main/java/li/strolch/model/query/BooleanSelection.java b/src/main/java/li/strolch/model/query/BooleanSelection.java index bfd9318bc..010d463d6 100644 --- a/src/main/java/li/strolch/model/query/BooleanSelection.java +++ b/src/main/java/li/strolch/model/query/BooleanSelection.java @@ -17,6 +17,7 @@ package li.strolch.model.query; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.List; /** @@ -27,19 +28,25 @@ public abstract class BooleanSelection implements Selection { protected List selections; public BooleanSelection() { - this.selections = new ArrayList<>(); + this.selections = new ArrayList<>(1); } public BooleanSelection(List selections) { this.selections = selections; } + public BooleanSelection(Selection leftHandSide, Selection rightHandSide) { + this.selections = new ArrayList<>(2); + this.selections.add(leftHandSide); + this.selections.add(rightHandSide); + } + public BooleanSelection(Selection... selections) { this.selections = Arrays.asList(selections); } public List getSelections() { - return this.selections; + return Collections.unmodifiableList(this.selections); } public BooleanSelection with(Selection selection) { @@ -47,5 +54,6 @@ public abstract class BooleanSelection implements Selection { return this; } + @Override public abstract void accept(QueryVisitor visitor); } diff --git a/src/main/java/li/strolch/model/query/IdSelection.java b/src/main/java/li/strolch/model/query/IdSelection.java index 9be311b08..1aea0f913 100644 --- a/src/main/java/li/strolch/model/query/IdSelection.java +++ b/src/main/java/li/strolch/model/query/IdSelection.java @@ -15,25 +15,57 @@ */ package li.strolch.model.query; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + /** * @author Robert von Burg */ public class IdSelection extends StrolchElementSelection { - private String id; + private List ids; + + public IdSelection() { + this.ids = new ArrayList<>(1); + } /** * @param id */ public IdSelection(String id) { - this.id = id; + this.ids = new ArrayList<>(1); + this.ids.add(id); } /** - * @return the id + * @param ids */ - public String getId() { - return this.id; + public IdSelection(String... ids) { + this.ids = Arrays.asList(ids); + } + + /** + * @param ids + */ + public IdSelection(List ids) { + this.ids = ids; + } + + /** + * @return the ids + */ + public List getIds() { + return this.ids; + } + + /** + * @param id + * @return + */ + public IdSelection with(String id) { + this.ids.add(id); + return this; } @Override diff --git a/src/main/java/li/strolch/model/query/NotSelection.java b/src/main/java/li/strolch/model/query/NotSelection.java new file mode 100644 index 000000000..a6ea2e0cf --- /dev/null +++ b/src/main/java/li/strolch/model/query/NotSelection.java @@ -0,0 +1,47 @@ +/* + * Copyright 2013 Robert von Burg + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package li.strolch.model.query; + +/** + * @author Robert von Burg + */ +public class NotSelection extends BooleanSelection { + + /** + * @param selection + */ + public NotSelection(Selection selection) { + super(selection); + } + + /** + * @throws UnsupportedOperationException + * because a {@link NotSelection} can only work on a single {@link Selection} + */ + @Override + public NotSelection with(Selection selection) { + throw new UnsupportedOperationException("NotSelection can only have a single selection"); //$NON-NLS-1$ + } + + public Selection getSelection() { + return this.selections.get(0); + } + + @Override + public void accept(QueryVisitor visitor) { + visitor.visitNot(this); + } +} diff --git a/src/main/java/li/strolch/model/query/QueryVisitor.java b/src/main/java/li/strolch/model/query/QueryVisitor.java index c5e9b128a..f1a9dbe55 100644 --- a/src/main/java/li/strolch/model/query/QueryVisitor.java +++ b/src/main/java/li/strolch/model/query/QueryVisitor.java @@ -23,4 +23,6 @@ public interface QueryVisitor { public void visitAnd(AndSelection andSelection); public void visitOr(OrSelection orSelection); + + public void visitNot(NotSelection notSelection); } diff --git a/src/main/java/li/strolch/model/query/StrolchQuery.java b/src/main/java/li/strolch/model/query/StrolchQuery.java index 01e377347..256abdc85 100644 --- a/src/main/java/li/strolch/model/query/StrolchQuery.java +++ b/src/main/java/li/strolch/model/query/StrolchQuery.java @@ -43,6 +43,29 @@ public abstract class StrolchQuery { this.selections.add(selection); } + public StrolchQuery select(Selection selection) { + this.selections.add(selection); + return this; + } + + public StrolchQuery and(Selection... selections) { + AndSelection and = new AndSelection(selections); + this.selections.add(and); + return this; + } + + public StrolchQuery or(Selection... selections) { + OrSelection or = new OrSelection(selections); + this.selections.add(or); + return this; + } + + public StrolchQuery not(Selection selection) { + NotSelection not = new NotSelection(selection); + this.selections.add(not); + return this; + } + public void accept(T visitor) { this.navigation.accept(visitor); for (Selection selection : this.selections) {