diff --git a/common/src/main/java/me/lucko/luckperms/common/api/delegates/model/ApiStorage.java b/common/src/main/java/me/lucko/luckperms/common/api/delegates/model/ApiStorage.java index 08da96c8..23524810 100644 --- a/common/src/main/java/me/lucko/luckperms/common/api/delegates/model/ApiStorage.java +++ b/common/src/main/java/me/lucko/luckperms/common/api/delegates/model/ApiStorage.java @@ -33,6 +33,8 @@ import me.lucko.luckperms.api.Track; import me.lucko.luckperms.api.User; import me.lucko.luckperms.api.event.cause.CreationCause; import me.lucko.luckperms.api.event.cause.DeletionCause; +import me.lucko.luckperms.common.bulkupdate.comparisons.Constraint; +import me.lucko.luckperms.common.bulkupdate.comparisons.StandardComparison; import me.lucko.luckperms.common.node.factory.NodeFactory; import me.lucko.luckperms.common.plugin.LuckPermsPlugin; import me.lucko.luckperms.common.storage.Storage; @@ -148,7 +150,7 @@ public class ApiStorage implements me.lucko.luckperms.api.Storage { @Override public CompletableFuture>> getUsersWithPermission(@Nonnull String permission) { Objects.requireNonNull(permission, "permission"); - return this.handle.getUsersWithPermission(permission).exceptionally(consumeExceptionToNull()); + return this.handle.getUsersWithPermission(Constraint.of(StandardComparison.EQUAL, permission)).exceptionally(consumeExceptionToNull()); } @Nonnull @@ -202,7 +204,7 @@ public class ApiStorage implements me.lucko.luckperms.api.Storage { @Override public CompletableFuture>> getGroupsWithPermission(@Nonnull String permission) { Objects.requireNonNull(permission, "permission"); - return this.handle.getGroupsWithPermission(permission).exceptionally(consumeExceptionToNull()); + return this.handle.getGroupsWithPermission(Constraint.of(StandardComparison.EQUAL, permission)).exceptionally(consumeExceptionToNull()); } @Nonnull diff --git a/common/src/main/java/me/lucko/luckperms/common/bulkupdate/BulkUpdate.java b/common/src/main/java/me/lucko/luckperms/common/bulkupdate/BulkUpdate.java index d545a2f3..cf73d391 100644 --- a/common/src/main/java/me/lucko/luckperms/common/bulkupdate/BulkUpdate.java +++ b/common/src/main/java/me/lucko/luckperms/common/bulkupdate/BulkUpdate.java @@ -26,7 +26,7 @@ package me.lucko.luckperms.common.bulkupdate; import me.lucko.luckperms.common.bulkupdate.action.Action; -import me.lucko.luckperms.common.bulkupdate.constraint.Constraint; +import me.lucko.luckperms.common.bulkupdate.query.Query; import me.lucko.luckperms.common.node.model.NodeDataContainer; import java.util.List; @@ -45,12 +45,12 @@ public final class BulkUpdate { private final Action action; // a set of constraints which data must match to be acted upon - private final List constraints; + private final List queries; - public BulkUpdate(DataType dataType, Action action, List constraints) { + public BulkUpdate(DataType dataType, Action action, List queries) { this.dataType = dataType; this.action = action; - this.constraints = constraints; + this.queries = queries; } /** @@ -60,8 +60,8 @@ public final class BulkUpdate { * @return true if satisfied */ public boolean satisfiesConstraints(NodeDataContainer node) { - for (Constraint constraint : this.constraints) { - if (!constraint.isSatisfiedBy(node)) { + for (Query query : this.queries) { + if (!query.isSatisfiedBy(node)) { return false; } } @@ -98,21 +98,21 @@ public final class BulkUpdate { sb.append(this.action.getAsSql()); // if there are no constraints, just return without a WHERE clause - if (this.constraints.isEmpty()) { + if (this.queries.isEmpty()) { return sb.append(";").toString(); } // append constraints sb.append(" WHERE"); - for (int i = 0; i < this.constraints.size(); i++) { - Constraint constraint = this.constraints.get(i); + for (int i = 0; i < this.queries.size(); i++) { + Query query = this.queries.get(i); sb.append(" "); if (i != 0) { sb.append("AND "); } - sb.append(constraint.getAsSql()); + sb.append(query.getAsSql()); } return sb.append(";").toString(); @@ -147,8 +147,8 @@ public final class BulkUpdate { return this.action; } - public List getConstraints() { - return this.constraints; + public List getQueries() { + return this.queries; } @Override @@ -159,12 +159,12 @@ public final class BulkUpdate { return Objects.equals(this.getDataType(), that.getDataType()) && Objects.equals(this.getAction(), that.getAction()) && - Objects.equals(this.getConstraints(), that.getConstraints()); + Objects.equals(this.getQueries(), that.getQueries()); } @Override public int hashCode() { - return Objects.hash(getDataType(), getAction(), getConstraints()); + return Objects.hash(getDataType(), getAction(), getQueries()); } @Override @@ -172,6 +172,6 @@ public final class BulkUpdate { return "BulkUpdate(" + "dataType=" + this.getDataType() + ", " + "action=" + this.getAction() + ", " + - "constraints=" + this.getConstraints() + ")"; + "constraints=" + this.getQueries() + ")"; } } diff --git a/common/src/main/java/me/lucko/luckperms/common/bulkupdate/BulkUpdateBuilder.java b/common/src/main/java/me/lucko/luckperms/common/bulkupdate/BulkUpdateBuilder.java index c89c53e3..36053d8a 100644 --- a/common/src/main/java/me/lucko/luckperms/common/bulkupdate/BulkUpdateBuilder.java +++ b/common/src/main/java/me/lucko/luckperms/common/bulkupdate/BulkUpdateBuilder.java @@ -28,7 +28,7 @@ package me.lucko.luckperms.common.bulkupdate; import com.google.common.collect.ImmutableList; import me.lucko.luckperms.common.bulkupdate.action.Action; -import me.lucko.luckperms.common.bulkupdate.constraint.Constraint; +import me.lucko.luckperms.common.bulkupdate.query.Query; import java.util.LinkedHashSet; import java.util.Set; @@ -49,7 +49,7 @@ public class BulkUpdateBuilder { private Action action = null; // a set of constraints which data must match to be acted upon - private final Set constraints = new LinkedHashSet<>(); + private final Set queries = new LinkedHashSet<>(); private BulkUpdateBuilder() { } @@ -64,8 +64,8 @@ public class BulkUpdateBuilder { return this; } - public BulkUpdateBuilder constraint(Constraint constraint) { - this.constraints.add(constraint); + public BulkUpdateBuilder query(Query query) { + this.queries.add(query); return this; } @@ -74,7 +74,7 @@ public class BulkUpdateBuilder { throw new IllegalStateException("no action specified"); } - return new BulkUpdate(this.dataType, this.action, ImmutableList.copyOf(this.constraints)); + return new BulkUpdate(this.dataType, this.action, ImmutableList.copyOf(this.queries)); } @Override @@ -82,6 +82,6 @@ public class BulkUpdateBuilder { return "BulkUpdateBuilder(" + "dataType=" + this.dataType + ", " + "action=" + this.action + ", " + - "constraints=" + this.constraints + ")"; + "constraints=" + this.queries + ")"; } } diff --git a/common/src/main/java/me/lucko/luckperms/common/bulkupdate/action/UpdateAction.java b/common/src/main/java/me/lucko/luckperms/common/bulkupdate/action/UpdateAction.java index 0db5718e..bee5a2bc 100644 --- a/common/src/main/java/me/lucko/luckperms/common/bulkupdate/action/UpdateAction.java +++ b/common/src/main/java/me/lucko/luckperms/common/bulkupdate/action/UpdateAction.java @@ -26,7 +26,7 @@ package me.lucko.luckperms.common.bulkupdate.action; import me.lucko.luckperms.common.bulkupdate.BulkUpdate; -import me.lucko.luckperms.common.bulkupdate.constraint.QueryField; +import me.lucko.luckperms.common.bulkupdate.query.QueryField; import me.lucko.luckperms.common.node.model.NodeDataContainer; public class UpdateAction implements Action { diff --git a/common/src/main/java/me/lucko/luckperms/common/bulkupdate/comparisons/Constraint.java b/common/src/main/java/me/lucko/luckperms/common/bulkupdate/comparisons/Constraint.java new file mode 100644 index 00000000..0e12e1f2 --- /dev/null +++ b/common/src/main/java/me/lucko/luckperms/common/bulkupdate/comparisons/Constraint.java @@ -0,0 +1,68 @@ +/* + * This file is part of LuckPerms, licensed under the MIT License. + * + * Copyright (c) lucko (Luck) + * Copyright (c) contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package me.lucko.luckperms.common.bulkupdate.comparisons; + +import me.lucko.luckperms.common.bulkupdate.BulkUpdate; + +public class Constraint { + + public static Constraint of(Comparison comparison, String expression) { + return new Constraint(comparison, expression); + } + + // the comparison type being used in this query + private final Comparison comparison; + + // the expression being compared against + private final String expression; + + private Constraint(Comparison comparison, String expression) { + this.comparison = comparison; + this.expression = expression; + } + + /** + * Returns if the given value satisfies this constraint + * + * @param value the value + * @return true if satisfied + */ + public boolean eval(String value) { + return this.comparison.matches(value, this.expression); + } + + public String getAsSql(String field) { + return field + " " + this.comparison.getAsSql() + " " + BulkUpdate.escapeStringForSql(this.expression); + } + + public Comparison getComparison() { + return this.comparison; + } + + public String getExpression() { + return this.expression; + } +} diff --git a/common/src/main/java/me/lucko/luckperms/common/bulkupdate/constraint/Constraint.java b/common/src/main/java/me/lucko/luckperms/common/bulkupdate/query/Query.java similarity index 58% rename from common/src/main/java/me/lucko/luckperms/common/bulkupdate/constraint/Constraint.java rename to common/src/main/java/me/lucko/luckperms/common/bulkupdate/query/Query.java index bcf96050..103bac2e 100644 --- a/common/src/main/java/me/lucko/luckperms/common/bulkupdate/constraint/Constraint.java +++ b/common/src/main/java/me/lucko/luckperms/common/bulkupdate/query/Query.java @@ -23,38 +23,33 @@ * SOFTWARE. */ -package me.lucko.luckperms.common.bulkupdate.constraint; +package me.lucko.luckperms.common.bulkupdate.query; -import me.lucko.luckperms.common.bulkupdate.BulkUpdate; -import me.lucko.luckperms.common.bulkupdate.comparisons.Comparison; +import me.lucko.luckperms.common.bulkupdate.comparisons.Constraint; import me.lucko.luckperms.common.node.model.NodeDataContainer; /** - * Represents a query constraint + * Represents a query component */ -public class Constraint { +public class Query { - public static Constraint of(QueryField field, Comparison comparison, String value) { - return new Constraint(field, comparison, value); + public static Query of(QueryField field, Constraint constraint) { + return new Query(field, constraint); } - // the field this constraint is comparing against + // the field this query is comparing against private final QueryField field; - // the comparison type being used in this constraint - private final Comparison comparison; + // the constraint + private final Constraint constraint; - // the expression being compared against - private final String value; - - private Constraint(QueryField field, Comparison comparison, String value) { + private Query(QueryField field, Constraint constraint) { this.field = field; - this.comparison = comparison; - this.value = value; + this.constraint = constraint; } /** - * Returns if the given node satisfies this constraint + * Returns if the given node satisfies this query * * @param node the node * @return true if satisfied @@ -62,29 +57,25 @@ public class Constraint { public boolean isSatisfiedBy(NodeDataContainer node) { switch (this.field) { case PERMISSION: - return this.comparison.matches(node.getPermission(), this.value); + return this.constraint.eval(node.getPermission()); case SERVER: - return this.comparison.matches(node.getServer(), this.value); + return this.constraint.eval(node.getServer()); case WORLD: - return this.comparison.matches(node.getWorld(), this.value); + return this.constraint.eval(node.getWorld()); default: throw new RuntimeException(); } } public String getAsSql() { - return this.field.getSqlName() + " " + this.comparison.getAsSql() + " " + BulkUpdate.escapeStringForSql(this.value); + return this.constraint.getAsSql(this.field.getSqlName()); } public QueryField getField() { return this.field; } - public Comparison getComparison() { - return this.comparison; - } - - public String getValue() { - return this.value; + public Constraint getConstraint() { + return this.constraint; } } diff --git a/common/src/main/java/me/lucko/luckperms/common/bulkupdate/constraint/QueryField.java b/common/src/main/java/me/lucko/luckperms/common/bulkupdate/query/QueryField.java similarity index 96% rename from common/src/main/java/me/lucko/luckperms/common/bulkupdate/constraint/QueryField.java rename to common/src/main/java/me/lucko/luckperms/common/bulkupdate/query/QueryField.java index a36a06cf..cb5af5d3 100644 --- a/common/src/main/java/me/lucko/luckperms/common/bulkupdate/constraint/QueryField.java +++ b/common/src/main/java/me/lucko/luckperms/common/bulkupdate/query/QueryField.java @@ -23,7 +23,7 @@ * SOFTWARE. */ -package me.lucko.luckperms.common.bulkupdate.constraint; +package me.lucko.luckperms.common.bulkupdate.query; /** * Represents a field being used in an update diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/group/GroupListMembers.java b/common/src/main/java/me/lucko/luckperms/common/commands/group/GroupListMembers.java index 1ed46623..4b66706c 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/group/GroupListMembers.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/group/GroupListMembers.java @@ -31,6 +31,8 @@ import com.google.common.collect.Maps; import me.lucko.luckperms.api.HeldPermission; import me.lucko.luckperms.api.Node; +import me.lucko.luckperms.common.bulkupdate.comparisons.Constraint; +import me.lucko.luckperms.common.bulkupdate.comparisons.StandardComparison; import me.lucko.luckperms.common.command.CommandManager; import me.lucko.luckperms.common.command.CommandResult; import me.lucko.luckperms.common.command.abstraction.SubCommand; @@ -77,13 +79,13 @@ public class GroupListMembers extends SubCommand { return CommandResult.NO_PERMISSION; } - String query = NodeFactory.groupNode(group.getName()); + Constraint constraint = Constraint.of(StandardComparison.EQUAL, NodeFactory.groupNode(group.getName())); int page = ArgumentParser.parseIntOrElse(0, args, 1); Message.SEARCH_SEARCHING_MEMBERS.send(sender, group.getName()); - List> matchedUsers = plugin.getStorage().getUsersWithPermission(query).join(); - List> matchedGroups = plugin.getStorage().getGroupsWithPermission(query).join(); + List> matchedUsers = plugin.getStorage().getUsersWithPermission(constraint).join(); + List> matchedGroups = plugin.getStorage().getGroupsWithPermission(constraint).join(); int users = matchedUsers.size(); int groups = matchedGroups.size(); diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/misc/BulkUpdateCommand.java b/common/src/main/java/me/lucko/luckperms/common/commands/misc/BulkUpdateCommand.java index a9b734b8..bd038cf0 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/misc/BulkUpdateCommand.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/misc/BulkUpdateCommand.java @@ -34,9 +34,10 @@ import me.lucko.luckperms.common.bulkupdate.DataType; import me.lucko.luckperms.common.bulkupdate.action.DeleteAction; import me.lucko.luckperms.common.bulkupdate.action.UpdateAction; import me.lucko.luckperms.common.bulkupdate.comparisons.Comparison; +import me.lucko.luckperms.common.bulkupdate.comparisons.Constraint; import me.lucko.luckperms.common.bulkupdate.comparisons.StandardComparison; -import me.lucko.luckperms.common.bulkupdate.constraint.Constraint; -import me.lucko.luckperms.common.bulkupdate.constraint.QueryField; +import me.lucko.luckperms.common.bulkupdate.query.Query; +import me.lucko.luckperms.common.bulkupdate.query.QueryField; import me.lucko.luckperms.common.command.CommandResult; import me.lucko.luckperms.common.command.abstraction.CommandException; import me.lucko.luckperms.common.command.abstraction.SingleCommand; @@ -141,7 +142,7 @@ public class BulkUpdateCommand extends SingleCommand { } String expr = parts[2]; - bulkUpdateBuilder.constraint(Constraint.of(field, comparison, expr)); + bulkUpdateBuilder.query(Query.of(field, Constraint.of(comparison, expr))); } String id = String.format("%04d", ThreadLocalRandom.current().nextInt(10000)); diff --git a/common/src/main/java/me/lucko/luckperms/common/commands/misc/SearchCommand.java b/common/src/main/java/me/lucko/luckperms/common/commands/misc/SearchCommand.java index 4002946f..16f3e600 100644 --- a/common/src/main/java/me/lucko/luckperms/common/commands/misc/SearchCommand.java +++ b/common/src/main/java/me/lucko/luckperms/common/commands/misc/SearchCommand.java @@ -31,6 +31,9 @@ import com.google.common.collect.Maps; import me.lucko.luckperms.api.HeldPermission; import me.lucko.luckperms.api.Node; +import me.lucko.luckperms.common.bulkupdate.comparisons.Comparison; +import me.lucko.luckperms.common.bulkupdate.comparisons.Constraint; +import me.lucko.luckperms.common.bulkupdate.comparisons.StandardComparison; import me.lucko.luckperms.common.command.CommandManager; import me.lucko.luckperms.common.command.CommandResult; import me.lucko.luckperms.common.command.abstraction.SingleCommand; @@ -66,13 +69,19 @@ import java.util.stream.Collectors; public class SearchCommand extends SingleCommand { public SearchCommand(LocaleManager locale) { - super(CommandSpec.SEARCH.localize(locale), "Search", CommandPermission.SEARCH, Predicates.notInRange(1, 2)); + super(CommandSpec.SEARCH.localize(locale), "Search", CommandPermission.SEARCH, Predicates.notInRange(1, 3)); } @Override public CommandResult execute(LuckPermsPlugin plugin, Sender sender, List args, String label) { - String query = args.get(0); - int page = ArgumentParser.parseIntOrElse(1, args, 1); + Comparison comparison = StandardComparison.parseComparison(args.get(0)); + if (comparison == null) { + comparison = StandardComparison.EQUAL; + args.add(0, "=="); + } + + Constraint query = Constraint.of(comparison, args.get(1)); + int page = ArgumentParser.parseIntOrElse(2, args, 1); Message.SEARCH_SEARCHING.send(sender, query); @@ -93,11 +102,11 @@ public class SearchCommand extends SingleCommand { } return s; }); - sendResult(sender, matchedUsers, uuidLookups::get, Message.SEARCH_SHOWING_USERS, HolderType.USER, label, page); + sendResult(sender, matchedUsers, uuidLookups::get, Message.SEARCH_SHOWING_USERS, HolderType.USER, label, page, comparison); } if (!matchedGroups.isEmpty()) { - sendResult(sender, matchedGroups, Function.identity(), Message.SEARCH_SHOWING_GROUPS, HolderType.GROUP, label, page); + sendResult(sender, matchedGroups, Function.identity(), Message.SEARCH_SHOWING_GROUPS, HolderType.GROUP, label, page, comparison); } return CommandResult.SUCCESS; @@ -108,7 +117,7 @@ public class SearchCommand extends SingleCommand { return TabCompletions.getPermissionTabComplete(args, plugin.getPermissionRegistry()); } - private static > void sendResult(Sender sender, List> results, Function lookupFunction, Message headerMessage, HolderType holderType, String label, int page) { + private static > void sendResult(Sender sender, List> results, Function lookupFunction, Message headerMessage, HolderType holderType, String label, int page, Comparison comparison) { results = new ArrayList<>(results); results.sort(HeldPermissionComparator.normal()); @@ -130,7 +139,13 @@ public class SearchCommand extends SingleCommand { headerMessage.send(sender, page, pages.size(), results.size()); for (Map.Entry> ent : mappedContent) { - String s = "&3> &b" + ent.getKey() + " &7- " + (ent.getValue().getValue() ? "&a" : "&c") + ent.getValue().getValue() + getNodeExpiryString(ent.getValue().asNode()) + MessageUtils.getAppendableNodeContextString(ent.getValue().asNode()); + // only show the permission in the results if the comparison isn't equals + String permission = ""; + if (comparison != StandardComparison.EQUAL) { + permission = "&7 - (" + ent.getValue().getPermission() + ")"; + } + + String s = "&3> &b" + ent.getKey() + permission + "&7 - " + (ent.getValue().getValue() ? "&a" : "&c") + ent.getValue().getValue() + getNodeExpiryString(ent.getValue().asNode()) + MessageUtils.getAppendableNodeContextString(ent.getValue().asNode()); TextComponent message = TextUtils.fromLegacy(s, CommandManager.AMPERSAND_CHAR).toBuilder().applyDeep(makeFancy(ent.getKey(), holderType, label, ent.getValue())).build(); sender.sendMessage(message); } diff --git a/common/src/main/java/me/lucko/luckperms/common/storage/AbstractStorage.java b/common/src/main/java/me/lucko/luckperms/common/storage/AbstractStorage.java index 69b5cfd3..250d7fdd 100644 --- a/common/src/main/java/me/lucko/luckperms/common/storage/AbstractStorage.java +++ b/common/src/main/java/me/lucko/luckperms/common/storage/AbstractStorage.java @@ -35,6 +35,7 @@ import me.lucko.luckperms.api.event.cause.DeletionCause; import me.lucko.luckperms.common.actionlog.Log; import me.lucko.luckperms.common.api.delegates.model.ApiStorage; import me.lucko.luckperms.common.bulkupdate.BulkUpdate; +import me.lucko.luckperms.common.bulkupdate.comparisons.Constraint; import me.lucko.luckperms.common.model.Group; import me.lucko.luckperms.common.model.Track; import me.lucko.luckperms.common.model.User; @@ -181,9 +182,9 @@ public class AbstractStorage implements Storage { } @Override - public CompletableFuture>> getUsersWithPermission(String permission) { + public CompletableFuture>> getUsersWithPermission(Constraint constraint) { return makeFuture(() -> { - List> result = this.dao.getUsersWithPermission(permission); + List> result = this.dao.getUsersWithPermission(constraint); result.removeIf(entry -> entry.asNode().hasExpired()); return ImmutableList.copyOf(result); }); @@ -233,9 +234,9 @@ public class AbstractStorage implements Storage { } @Override - public CompletableFuture>> getGroupsWithPermission(String permission) { + public CompletableFuture>> getGroupsWithPermission(Constraint constraint) { return makeFuture(() -> { - List> result = this.dao.getGroupsWithPermission(permission); + List> result = this.dao.getGroupsWithPermission(constraint); result.removeIf(entry -> entry.asNode().hasExpired()); return ImmutableList.copyOf(result); }); diff --git a/common/src/main/java/me/lucko/luckperms/common/storage/Storage.java b/common/src/main/java/me/lucko/luckperms/common/storage/Storage.java index 58f01863..89ac09e5 100644 --- a/common/src/main/java/me/lucko/luckperms/common/storage/Storage.java +++ b/common/src/main/java/me/lucko/luckperms/common/storage/Storage.java @@ -32,6 +32,7 @@ import me.lucko.luckperms.api.event.cause.DeletionCause; import me.lucko.luckperms.common.actionlog.Log; import me.lucko.luckperms.common.api.delegates.model.ApiStorage; import me.lucko.luckperms.common.bulkupdate.BulkUpdate; +import me.lucko.luckperms.common.bulkupdate.comparisons.Constraint; import me.lucko.luckperms.common.model.Group; import me.lucko.luckperms.common.model.Track; import me.lucko.luckperms.common.model.User; @@ -75,7 +76,7 @@ public interface Storage { CompletableFuture> getUniqueUsers(); - CompletableFuture>> getUsersWithPermission(String permission); + CompletableFuture>> getUsersWithPermission(Constraint constraint); CompletableFuture createAndLoadGroup(String name, CreationCause cause); @@ -87,7 +88,7 @@ public interface Storage { CompletableFuture deleteGroup(Group group, DeletionCause cause); - CompletableFuture>> getGroupsWithPermission(String permission); + CompletableFuture>> getGroupsWithPermission(Constraint constraint); CompletableFuture createAndLoadTrack(String name, CreationCause cause); diff --git a/common/src/main/java/me/lucko/luckperms/common/storage/dao/AbstractDao.java b/common/src/main/java/me/lucko/luckperms/common/storage/dao/AbstractDao.java index 31e67622..200bf80e 100644 --- a/common/src/main/java/me/lucko/luckperms/common/storage/dao/AbstractDao.java +++ b/common/src/main/java/me/lucko/luckperms/common/storage/dao/AbstractDao.java @@ -29,6 +29,7 @@ import me.lucko.luckperms.api.HeldPermission; import me.lucko.luckperms.api.LogEntry; import me.lucko.luckperms.common.actionlog.Log; import me.lucko.luckperms.common.bulkupdate.BulkUpdate; +import me.lucko.luckperms.common.bulkupdate.comparisons.Constraint; import me.lucko.luckperms.common.model.Group; import me.lucko.luckperms.common.model.Track; import me.lucko.luckperms.common.model.User; @@ -82,7 +83,7 @@ public abstract class AbstractDao { public abstract Set getUniqueUsers() throws Exception; - public abstract List> getUsersWithPermission(String permission) throws Exception; + public abstract List> getUsersWithPermission(Constraint constraint) throws Exception; public abstract Group createAndLoadGroup(String name) throws Exception; @@ -94,7 +95,7 @@ public abstract class AbstractDao { public abstract void deleteGroup(Group group) throws Exception; - public abstract List> getGroupsWithPermission(String permission) throws Exception; + public abstract List> getGroupsWithPermission(Constraint constraint) throws Exception; public abstract Track createAndLoadTrack(String name) throws Exception; diff --git a/common/src/main/java/me/lucko/luckperms/common/storage/dao/SplitStorageDao.java b/common/src/main/java/me/lucko/luckperms/common/storage/dao/SplitStorageDao.java index 6c949d6c..cf7249d2 100644 --- a/common/src/main/java/me/lucko/luckperms/common/storage/dao/SplitStorageDao.java +++ b/common/src/main/java/me/lucko/luckperms/common/storage/dao/SplitStorageDao.java @@ -31,6 +31,7 @@ import me.lucko.luckperms.api.HeldPermission; import me.lucko.luckperms.api.LogEntry; import me.lucko.luckperms.common.actionlog.Log; import me.lucko.luckperms.common.bulkupdate.BulkUpdate; +import me.lucko.luckperms.common.bulkupdate.comparisons.Constraint; import me.lucko.luckperms.common.model.Group; import me.lucko.luckperms.common.model.Track; import me.lucko.luckperms.common.model.User; @@ -132,8 +133,8 @@ public class SplitStorageDao extends AbstractDao { } @Override - public List> getUsersWithPermission(String permission) throws Exception { - return this.backing.get(this.types.get(SplitStorageType.USER)).getUsersWithPermission(permission); + public List> getUsersWithPermission(Constraint constraint) throws Exception { + return this.backing.get(this.types.get(SplitStorageType.USER)).getUsersWithPermission(constraint); } @Override @@ -162,8 +163,8 @@ public class SplitStorageDao extends AbstractDao { } @Override - public List> getGroupsWithPermission(String permission) throws Exception { - return this.backing.get(this.types.get(SplitStorageType.GROUP)).getGroupsWithPermission(permission); + public List> getGroupsWithPermission(Constraint constraint) throws Exception { + return this.backing.get(this.types.get(SplitStorageType.GROUP)).getGroupsWithPermission(constraint); } @Override diff --git a/common/src/main/java/me/lucko/luckperms/common/storage/dao/file/CombinedConfigurateDao.java b/common/src/main/java/me/lucko/luckperms/common/storage/dao/file/CombinedConfigurateDao.java index 7b4f01a5..b8101b27 100644 --- a/common/src/main/java/me/lucko/luckperms/common/storage/dao/file/CombinedConfigurateDao.java +++ b/common/src/main/java/me/lucko/luckperms/common/storage/dao/file/CombinedConfigurateDao.java @@ -27,6 +27,7 @@ package me.lucko.luckperms.common.storage.dao.file; import me.lucko.luckperms.api.HeldPermission; import me.lucko.luckperms.common.bulkupdate.BulkUpdate; +import me.lucko.luckperms.common.bulkupdate.comparisons.Constraint; import me.lucko.luckperms.common.managers.group.GroupManager; import me.lucko.luckperms.common.managers.track.TrackManager; import me.lucko.luckperms.common.node.model.NodeDataContainer; @@ -262,7 +263,7 @@ public class CombinedConfigurateDao extends AbstractConfigurateDao { } @Override - public List> getUsersWithPermission(String permission) throws Exception { + public List> getUsersWithPermission(Constraint constraint) throws Exception { List> held = new ArrayList<>(); this.usersLoader.apply(false, true, root -> { for (Map.Entry entry : root.getChildrenMap().entrySet()) { @@ -272,7 +273,7 @@ public class CombinedConfigurateDao extends AbstractConfigurateDao { Set nodes = readNodes(object); for (NodeDataContainer e : nodes) { - if (!e.getPermission().equalsIgnoreCase(permission)) { + if (!constraint.eval(e.getPermission())) { continue; } held.add(NodeHeldPermission.of(holder, e)); @@ -316,7 +317,7 @@ public class CombinedConfigurateDao extends AbstractConfigurateDao { } @Override - public List> getGroupsWithPermission(String permission) throws Exception { + public List> getGroupsWithPermission(Constraint constraint) throws Exception { List> held = new ArrayList<>(); this.groupsLoader.apply(false, true, root -> { for (Map.Entry entry : root.getChildrenMap().entrySet()) { @@ -326,7 +327,7 @@ public class CombinedConfigurateDao extends AbstractConfigurateDao { Set nodes = readNodes(object); for (NodeDataContainer e : nodes) { - if (!e.getPermission().equalsIgnoreCase(permission)) { + if (!constraint.eval(e.getPermission())) { continue; } held.add(NodeHeldPermission.of(holder, e)); diff --git a/common/src/main/java/me/lucko/luckperms/common/storage/dao/file/SeparatedConfigurateDao.java b/common/src/main/java/me/lucko/luckperms/common/storage/dao/file/SeparatedConfigurateDao.java index af5c593d..edac91aa 100644 --- a/common/src/main/java/me/lucko/luckperms/common/storage/dao/file/SeparatedConfigurateDao.java +++ b/common/src/main/java/me/lucko/luckperms/common/storage/dao/file/SeparatedConfigurateDao.java @@ -27,6 +27,7 @@ package me.lucko.luckperms.common.storage.dao.file; import me.lucko.luckperms.api.HeldPermission; import me.lucko.luckperms.common.bulkupdate.BulkUpdate; +import me.lucko.luckperms.common.bulkupdate.comparisons.Constraint; import me.lucko.luckperms.common.managers.group.GroupManager; import me.lucko.luckperms.common.managers.track.TrackManager; import me.lucko.luckperms.common.model.User; @@ -253,7 +254,7 @@ public class SeparatedConfigurateDao extends AbstractConfigurateDao { } @Override - public List> getUsersWithPermission(String permission) throws Exception { + public List> getUsersWithPermission(Constraint constraint) throws Exception { List> held = new ArrayList<>(); try (Stream stream = Files.list(getDirectory(StorageLocation.USER))) { stream.filter(getFileTypeFilter()) @@ -265,7 +266,7 @@ public class SeparatedConfigurateDao extends AbstractConfigurateDao { UUID holder = UUID.fromString(fileName.substring(0, fileName.length() - this.fileExtension.length())); Set nodes = readNodes(object); for (NodeDataContainer e : nodes) { - if (!e.getPermission().equalsIgnoreCase(permission)) { + if (!constraint.eval(e.getPermission())) { continue; } held.add(NodeHeldPermission.of(holder, e)); @@ -309,7 +310,7 @@ public class SeparatedConfigurateDao extends AbstractConfigurateDao { } @Override - public List> getGroupsWithPermission(String permission) throws Exception { + public List> getGroupsWithPermission(Constraint constraint) throws Exception { List> held = new ArrayList<>(); try (Stream stream = Files.list(getDirectory(StorageLocation.USER))) { stream.filter(getFileTypeFilter()) @@ -321,7 +322,7 @@ public class SeparatedConfigurateDao extends AbstractConfigurateDao { String holder = fileName.substring(0, fileName.length() - this.fileExtension.length()); Set nodes = readNodes(object); for (NodeDataContainer e : nodes) { - if (!e.getPermission().equalsIgnoreCase(permission)) { + if (!constraint.eval(e.getPermission())) { continue; } held.add(NodeHeldPermission.of(holder, e)); diff --git a/common/src/main/java/me/lucko/luckperms/common/storage/dao/mongodb/MongoDao.java b/common/src/main/java/me/lucko/luckperms/common/storage/dao/mongodb/MongoDao.java index f391c599..270f4363 100644 --- a/common/src/main/java/me/lucko/luckperms/common/storage/dao/mongodb/MongoDao.java +++ b/common/src/main/java/me/lucko/luckperms/common/storage/dao/mongodb/MongoDao.java @@ -46,6 +46,7 @@ import me.lucko.luckperms.api.context.MutableContextSet; import me.lucko.luckperms.common.actionlog.ExtendedLogEntry; import me.lucko.luckperms.common.actionlog.Log; import me.lucko.luckperms.common.bulkupdate.BulkUpdate; +import me.lucko.luckperms.common.bulkupdate.comparisons.Constraint; import me.lucko.luckperms.common.managers.group.GroupManager; import me.lucko.luckperms.common.managers.track.TrackManager; import me.lucko.luckperms.common.model.Group; @@ -319,7 +320,7 @@ public class MongoDao extends AbstractDao { } @Override - public List> getUsersWithPermission(String permission) { + public List> getUsersWithPermission(Constraint constraint) { List> held = new ArrayList<>(); MongoCollection c = this.database.getCollection(this.prefix + "users"); try (MongoCursor cursor = c.find().iterator()) { @@ -329,7 +330,7 @@ public class MongoDao extends AbstractDao { Set nodes = new HashSet<>(nodesFromDoc(d)); for (NodeDataContainer e : nodes) { - if (!e.getPermission().equalsIgnoreCase(permission)) { + if (!constraint.eval(e.getPermission())) { continue; } held.add(NodeHeldPermission.of(holder, e)); @@ -446,7 +447,7 @@ public class MongoDao extends AbstractDao { } @Override - public List> getGroupsWithPermission(String permission) { + public List> getGroupsWithPermission(Constraint constraint) { List> held = new ArrayList<>(); MongoCollection c = this.database.getCollection(this.prefix + "groups"); try (MongoCursor cursor = c.find().iterator()) { @@ -456,7 +457,7 @@ public class MongoDao extends AbstractDao { String holder = d.getString("_id"); Set nodes = new HashSet<>(nodesFromDoc(d)); for (NodeDataContainer e : nodes) { - if (!e.getPermission().equalsIgnoreCase(permission)) { + if (!constraint.eval(e.getPermission())) { continue; } held.add(NodeHeldPermission.of(holder, e)); diff --git a/common/src/main/java/me/lucko/luckperms/common/storage/dao/sql/SqlDao.java b/common/src/main/java/me/lucko/luckperms/common/storage/dao/sql/SqlDao.java index 732fc352..c03def38 100644 --- a/common/src/main/java/me/lucko/luckperms/common/storage/dao/sql/SqlDao.java +++ b/common/src/main/java/me/lucko/luckperms/common/storage/dao/sql/SqlDao.java @@ -35,6 +35,7 @@ import me.lucko.luckperms.api.Node; import me.lucko.luckperms.common.actionlog.ExtendedLogEntry; import me.lucko.luckperms.common.actionlog.Log; import me.lucko.luckperms.common.bulkupdate.BulkUpdate; +import me.lucko.luckperms.common.bulkupdate.comparisons.Constraint; import me.lucko.luckperms.common.contexts.ContextSetJsonSerializer; import me.lucko.luckperms.common.managers.group.GroupManager; import me.lucko.luckperms.common.managers.track.TrackManager; @@ -81,7 +82,7 @@ public class SqlDao extends AbstractDao { private static final String USER_PERMISSIONS_DELETE = "DELETE FROM {prefix}user_permissions WHERE uuid=?"; private static final String USER_PERMISSIONS_INSERT = "INSERT INTO {prefix}user_permissions(uuid, permission, value, server, world, expiry, contexts) VALUES(?, ?, ?, ?, ?, ?, ?)"; private static final String USER_PERMISSIONS_SELECT_DISTINCT = "SELECT DISTINCT uuid FROM {prefix}user_permissions"; - private static final String USER_PERMISSIONS_SELECT_PERMISSION = "SELECT uuid, value, server, world, expiry, contexts FROM {prefix}user_permissions WHERE permission=?"; + private static final String USER_PERMISSIONS_SELECT_PERMISSION = "SELECT uuid, permission, value, server, world, expiry, contexts FROM {prefix}user_permissions WHERE"; private static final String PLAYER_SELECT_UUID_BY_USERNAME = "SELECT uuid FROM {prefix}players WHERE username=? LIMIT 1"; private static final String PLAYER_SELECT_USERNAME_BY_UUID = "SELECT username FROM {prefix}players WHERE uuid=? LIMIT 1"; @@ -97,7 +98,7 @@ public class SqlDao extends AbstractDao { private static final String GROUP_PERMISSIONS_DELETE = "DELETE FROM {prefix}group_permissions WHERE name=?"; private static final String GROUP_PERMISSIONS_DELETE_SPECIFIC = "DELETE FROM {prefix}group_permissions WHERE name=? AND permission=? AND value=? AND server=? AND world=? AND expiry=? AND contexts=?"; private static final String GROUP_PERMISSIONS_INSERT = "INSERT INTO {prefix}group_permissions(name, permission, value, server, world, expiry, contexts) VALUES(?, ?, ?, ?, ?, ?, ?)"; - private static final String GROUP_PERMISSIONS_SELECT_PERMISSION = "SELECT name, value, server, world, expiry, contexts FROM {prefix}group_permissions WHERE permission=?"; + private static final String GROUP_PERMISSIONS_SELECT_PERMISSION = "SELECT name, permission, value, server, world, expiry, contexts FROM {prefix}group_permissions WHERE"; private static final String GROUP_SELECT_ALL = "SELECT name FROM {prefix}groups"; private static final String MYSQL_GROUP_INSERT = "INSERT INTO {prefix}groups (name) VALUES(?) ON DUPLICATE KEY UPDATE name=name"; @@ -493,21 +494,21 @@ public class SqlDao extends AbstractDao { } @Override - public List> getUsersWithPermission(String permission) throws SQLException { + public List> getUsersWithPermission(Constraint constraint) throws SQLException { List> held = new ArrayList<>(); try (Connection c = this.provider.getConnection()) { - try (PreparedStatement ps = c.prepareStatement(this.prefix.apply(USER_PERMISSIONS_SELECT_PERMISSION))) { - ps.setString(1, permission); + try (PreparedStatement ps = c.prepareStatement(this.prefix.apply(USER_PERMISSIONS_SELECT_PERMISSION + constraint.getAsSql("permission")))) { try (ResultSet rs = ps.executeQuery()) { while (rs.next()) { UUID holder = UUID.fromString(rs.getString("uuid")); + String perm = rs.getString("permission"); boolean value = rs.getBoolean("value"); String server = rs.getString("server"); String world = rs.getString("world"); long expiry = rs.getLong("expiry"); String contexts = rs.getString("contexts"); - NodeDataContainer data = deserializeNode(permission, value, server, world, expiry, contexts); + NodeDataContainer data = deserializeNode(perm, value, server, world, expiry, contexts); held.add(NodeHeldPermission.of(holder, data)); } } @@ -737,21 +738,21 @@ public class SqlDao extends AbstractDao { } @Override - public List> getGroupsWithPermission(String permission) throws SQLException { + public List> getGroupsWithPermission(Constraint constraint) throws SQLException { List> held = new ArrayList<>(); try (Connection c = this.provider.getConnection()) { - try (PreparedStatement ps = c.prepareStatement(this.prefix.apply(GROUP_PERMISSIONS_SELECT_PERMISSION))) { - ps.setString(1, permission); + try (PreparedStatement ps = c.prepareStatement(this.prefix.apply(GROUP_PERMISSIONS_SELECT_PERMISSION + constraint.getAsSql("permission")))) { try (ResultSet rs = ps.executeQuery()) { while (rs.next()) { String holder = rs.getString("name"); + String perm = rs.getString("permission"); boolean value = rs.getBoolean("value"); String server = rs.getString("server"); String world = rs.getString("world"); long expiry = rs.getLong("expiry"); String contexts = rs.getString("contexts"); - NodeDataContainer data = deserializeNode(permission, value, server, world, expiry, contexts); + NodeDataContainer data = deserializeNode(perm, value, server, world, expiry, contexts); held.add(NodeHeldPermission.of(holder, data)); } } diff --git a/sponge/src/main/java/me/lucko/luckperms/sponge/managers/SpongeGroupManager.java b/sponge/src/main/java/me/lucko/luckperms/sponge/managers/SpongeGroupManager.java index 328435f4..50eb90c8 100644 --- a/sponge/src/main/java/me/lucko/luckperms/sponge/managers/SpongeGroupManager.java +++ b/sponge/src/main/java/me/lucko/luckperms/sponge/managers/SpongeGroupManager.java @@ -36,6 +36,8 @@ import me.lucko.luckperms.api.HeldPermission; import me.lucko.luckperms.api.Tristate; import me.lucko.luckperms.api.context.ImmutableContextSet; import me.lucko.luckperms.api.event.cause.CreationCause; +import me.lucko.luckperms.common.bulkupdate.comparisons.Constraint; +import me.lucko.luckperms.common.bulkupdate.comparisons.StandardComparison; import me.lucko.luckperms.common.managers.group.AbstractGroupManager; import me.lucko.luckperms.common.storage.DataConstraints; import me.lucko.luckperms.common.utils.ImmutableCollectors; @@ -187,7 +189,7 @@ public class SpongeGroupManager extends AbstractGroupManager implem return CompletableFuture.supplyAsync(() -> { ImmutableMap.Builder ret = ImmutableMap.builder(); - List> lookup = this.plugin.getStorage().getGroupsWithPermission(permission).join(); + List> lookup = this.plugin.getStorage().getGroupsWithPermission(Constraint.of(StandardComparison.EQUAL, permission)).join(); for (HeldPermission holder : lookup) { if (holder.asNode().getFullContexts().equals(ImmutableContextSet.empty())) { ret.put(getService().getReferenceFactory().obtain(getIdentifier(), holder.getHolder()), holder.getValue()); @@ -203,7 +205,7 @@ public class SpongeGroupManager extends AbstractGroupManager implem return CompletableFuture.supplyAsync(() -> { ImmutableMap.Builder ret = ImmutableMap.builder(); - List> lookup = this.plugin.getStorage().getGroupsWithPermission(permission).join(); + List> lookup = this.plugin.getStorage().getGroupsWithPermission(Constraint.of(StandardComparison.EQUAL, permission)).join(); for (HeldPermission holder : lookup) { if (holder.asNode().getFullContexts().equals(contexts)) { ret.put(getService().getReferenceFactory().obtain(getIdentifier(), holder.getHolder()), holder.getValue()); diff --git a/sponge/src/main/java/me/lucko/luckperms/sponge/managers/SpongeUserManager.java b/sponge/src/main/java/me/lucko/luckperms/sponge/managers/SpongeUserManager.java index 85d70be9..22701320 100644 --- a/sponge/src/main/java/me/lucko/luckperms/sponge/managers/SpongeUserManager.java +++ b/sponge/src/main/java/me/lucko/luckperms/sponge/managers/SpongeUserManager.java @@ -35,6 +35,8 @@ import com.google.common.collect.Maps; import me.lucko.luckperms.api.HeldPermission; import me.lucko.luckperms.api.Tristate; import me.lucko.luckperms.api.context.ImmutableContextSet; +import me.lucko.luckperms.common.bulkupdate.comparisons.Constraint; +import me.lucko.luckperms.common.bulkupdate.comparisons.StandardComparison; import me.lucko.luckperms.common.managers.user.AbstractUserManager; import me.lucko.luckperms.common.managers.user.UserHousekeeper; import me.lucko.luckperms.common.model.UserIdentifier; @@ -212,7 +214,7 @@ public class SpongeUserManager extends AbstractUserManager implement return CompletableFuture.supplyAsync(() -> { ImmutableMap.Builder ret = ImmutableMap.builder(); - List> lookup = this.plugin.getStorage().getUsersWithPermission(permission).join(); + List> lookup = this.plugin.getStorage().getUsersWithPermission(Constraint.of(StandardComparison.EQUAL, permission)).join(); for (HeldPermission holder : lookup) { if (holder.asNode().getFullContexts().equals(ImmutableContextSet.empty())) { ret.put(getService().getReferenceFactory().obtain(getIdentifier(), holder.getHolder().toString()), holder.getValue()); @@ -228,7 +230,7 @@ public class SpongeUserManager extends AbstractUserManager implement return CompletableFuture.supplyAsync(() -> { ImmutableMap.Builder ret = ImmutableMap.builder(); - List> lookup = this.plugin.getStorage().getUsersWithPermission(permission).join(); + List> lookup = this.plugin.getStorage().getUsersWithPermission(Constraint.of(StandardComparison.EQUAL, permission)).join(); for (HeldPermission holder : lookup) { if (holder.asNode().getFullContexts().equals(contexts)) { ret.put(getService().getReferenceFactory().obtain(getIdentifier(), holder.getHolder().toString()), holder.getValue());