Implement different comparison methods for /lp search (#917)

This commit is contained in:
Luck 2018-05-04 18:11:11 +01:00
parent 7da0c58b76
commit 194b602fd6
No known key found for this signature in database
GPG Key ID: EFA9B3EC5FD90F8B
20 changed files with 194 additions and 103 deletions

View File

@ -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<List<HeldPermission<UUID>>> 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<List<HeldPermission<String>>> 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

View File

@ -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<Constraint> constraints;
private final List<Query> queries;
public BulkUpdate(DataType dataType, Action action, List<Constraint> constraints) {
public BulkUpdate(DataType dataType, Action action, List<Query> 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<Constraint> getConstraints() {
return this.constraints;
public List<Query> 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() + ")";
}
}

View File

@ -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<Constraint> constraints = new LinkedHashSet<>();
private final Set<Query> 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 + ")";
}
}

View File

@ -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 {

View File

@ -0,0 +1,68 @@
/*
* This file is part of LuckPerms, licensed under the MIT License.
*
* Copyright (c) lucko (Luck) <luck@lucko.me>
* 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;
}
}

View File

@ -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;
}
}

View File

@ -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

View File

@ -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<Group> {
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<HeldPermission<UUID>> matchedUsers = plugin.getStorage().getUsersWithPermission(query).join();
List<HeldPermission<String>> matchedGroups = plugin.getStorage().getGroupsWithPermission(query).join();
List<HeldPermission<UUID>> matchedUsers = plugin.getStorage().getUsersWithPermission(constraint).join();
List<HeldPermission<String>> matchedGroups = plugin.getStorage().getGroupsWithPermission(constraint).join();
int users = matchedUsers.size();
int groups = matchedGroups.size();

View File

@ -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));

View File

@ -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<String> 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 <T extends Comparable<T>> void sendResult(Sender sender, List<HeldPermission<T>> results, Function<T, String> lookupFunction, Message headerMessage, HolderType holderType, String label, int page) {
private static <T extends Comparable<T>> void sendResult(Sender sender, List<HeldPermission<T>> results, Function<T, String> 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<String, HeldPermission<T>> 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);
}

View File

@ -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<List<HeldPermission<UUID>>> getUsersWithPermission(String permission) {
public CompletableFuture<List<HeldPermission<UUID>>> getUsersWithPermission(Constraint constraint) {
return makeFuture(() -> {
List<HeldPermission<UUID>> result = this.dao.getUsersWithPermission(permission);
List<HeldPermission<UUID>> 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<List<HeldPermission<String>>> getGroupsWithPermission(String permission) {
public CompletableFuture<List<HeldPermission<String>>> getGroupsWithPermission(Constraint constraint) {
return makeFuture(() -> {
List<HeldPermission<String>> result = this.dao.getGroupsWithPermission(permission);
List<HeldPermission<String>> result = this.dao.getGroupsWithPermission(constraint);
result.removeIf(entry -> entry.asNode().hasExpired());
return ImmutableList.copyOf(result);
});

View File

@ -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<Set<UUID>> getUniqueUsers();
CompletableFuture<List<HeldPermission<UUID>>> getUsersWithPermission(String permission);
CompletableFuture<List<HeldPermission<UUID>>> getUsersWithPermission(Constraint constraint);
CompletableFuture<Group> createAndLoadGroup(String name, CreationCause cause);
@ -87,7 +88,7 @@ public interface Storage {
CompletableFuture<Void> deleteGroup(Group group, DeletionCause cause);
CompletableFuture<List<HeldPermission<String>>> getGroupsWithPermission(String permission);
CompletableFuture<List<HeldPermission<String>>> getGroupsWithPermission(Constraint constraint);
CompletableFuture<Track> createAndLoadTrack(String name, CreationCause cause);

View File

@ -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<UUID> getUniqueUsers() throws Exception;
public abstract List<HeldPermission<UUID>> getUsersWithPermission(String permission) throws Exception;
public abstract List<HeldPermission<UUID>> 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<HeldPermission<String>> getGroupsWithPermission(String permission) throws Exception;
public abstract List<HeldPermission<String>> getGroupsWithPermission(Constraint constraint) throws Exception;
public abstract Track createAndLoadTrack(String name) throws Exception;

View File

@ -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<HeldPermission<UUID>> getUsersWithPermission(String permission) throws Exception {
return this.backing.get(this.types.get(SplitStorageType.USER)).getUsersWithPermission(permission);
public List<HeldPermission<UUID>> 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<HeldPermission<String>> getGroupsWithPermission(String permission) throws Exception {
return this.backing.get(this.types.get(SplitStorageType.GROUP)).getGroupsWithPermission(permission);
public List<HeldPermission<String>> getGroupsWithPermission(Constraint constraint) throws Exception {
return this.backing.get(this.types.get(SplitStorageType.GROUP)).getGroupsWithPermission(constraint);
}
@Override

View File

@ -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<HeldPermission<UUID>> getUsersWithPermission(String permission) throws Exception {
public List<HeldPermission<UUID>> getUsersWithPermission(Constraint constraint) throws Exception {
List<HeldPermission<UUID>> held = new ArrayList<>();
this.usersLoader.apply(false, true, root -> {
for (Map.Entry<Object, ? extends ConfigurationNode> entry : root.getChildrenMap().entrySet()) {
@ -272,7 +273,7 @@ public class CombinedConfigurateDao extends AbstractConfigurateDao {
Set<NodeDataContainer> 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<HeldPermission<String>> getGroupsWithPermission(String permission) throws Exception {
public List<HeldPermission<String>> getGroupsWithPermission(Constraint constraint) throws Exception {
List<HeldPermission<String>> held = new ArrayList<>();
this.groupsLoader.apply(false, true, root -> {
for (Map.Entry<Object, ? extends ConfigurationNode> entry : root.getChildrenMap().entrySet()) {
@ -326,7 +327,7 @@ public class CombinedConfigurateDao extends AbstractConfigurateDao {
Set<NodeDataContainer> nodes = readNodes(object);
for (NodeDataContainer e : nodes) {
if (!e.getPermission().equalsIgnoreCase(permission)) {
if (!constraint.eval(e.getPermission())) {
continue;
}
held.add(NodeHeldPermission.of(holder, e));

View File

@ -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<HeldPermission<UUID>> getUsersWithPermission(String permission) throws Exception {
public List<HeldPermission<UUID>> getUsersWithPermission(Constraint constraint) throws Exception {
List<HeldPermission<UUID>> held = new ArrayList<>();
try (Stream<Path> 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<NodeDataContainer> 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<HeldPermission<String>> getGroupsWithPermission(String permission) throws Exception {
public List<HeldPermission<String>> getGroupsWithPermission(Constraint constraint) throws Exception {
List<HeldPermission<String>> held = new ArrayList<>();
try (Stream<Path> 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<NodeDataContainer> nodes = readNodes(object);
for (NodeDataContainer e : nodes) {
if (!e.getPermission().equalsIgnoreCase(permission)) {
if (!constraint.eval(e.getPermission())) {
continue;
}
held.add(NodeHeldPermission.of(holder, e));

View File

@ -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<HeldPermission<UUID>> getUsersWithPermission(String permission) {
public List<HeldPermission<UUID>> getUsersWithPermission(Constraint constraint) {
List<HeldPermission<UUID>> held = new ArrayList<>();
MongoCollection<Document> c = this.database.getCollection(this.prefix + "users");
try (MongoCursor<Document> cursor = c.find().iterator()) {
@ -329,7 +330,7 @@ public class MongoDao extends AbstractDao {
Set<NodeDataContainer> 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<HeldPermission<String>> getGroupsWithPermission(String permission) {
public List<HeldPermission<String>> getGroupsWithPermission(Constraint constraint) {
List<HeldPermission<String>> held = new ArrayList<>();
MongoCollection<Document> c = this.database.getCollection(this.prefix + "groups");
try (MongoCursor<Document> cursor = c.find().iterator()) {
@ -456,7 +457,7 @@ public class MongoDao extends AbstractDao {
String holder = d.getString("_id");
Set<NodeDataContainer> 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));

View File

@ -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<HeldPermission<UUID>> getUsersWithPermission(String permission) throws SQLException {
public List<HeldPermission<UUID>> getUsersWithPermission(Constraint constraint) throws SQLException {
List<HeldPermission<UUID>> 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<HeldPermission<String>> getGroupsWithPermission(String permission) throws SQLException {
public List<HeldPermission<String>> getGroupsWithPermission(Constraint constraint) throws SQLException {
List<HeldPermission<String>> 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));
}
}

View File

@ -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<SpongeGroup> implem
return CompletableFuture.supplyAsync(() -> {
ImmutableMap.Builder<LPSubjectReference, Boolean> ret = ImmutableMap.builder();
List<HeldPermission<String>> lookup = this.plugin.getStorage().getGroupsWithPermission(permission).join();
List<HeldPermission<String>> lookup = this.plugin.getStorage().getGroupsWithPermission(Constraint.of(StandardComparison.EQUAL, permission)).join();
for (HeldPermission<String> 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<SpongeGroup> implem
return CompletableFuture.supplyAsync(() -> {
ImmutableMap.Builder<LPSubjectReference, Boolean> ret = ImmutableMap.builder();
List<HeldPermission<String>> lookup = this.plugin.getStorage().getGroupsWithPermission(permission).join();
List<HeldPermission<String>> lookup = this.plugin.getStorage().getGroupsWithPermission(Constraint.of(StandardComparison.EQUAL, permission)).join();
for (HeldPermission<String> holder : lookup) {
if (holder.asNode().getFullContexts().equals(contexts)) {
ret.put(getService().getReferenceFactory().obtain(getIdentifier(), holder.getHolder()), holder.getValue());

View File

@ -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<SpongeUser> implement
return CompletableFuture.supplyAsync(() -> {
ImmutableMap.Builder<LPSubjectReference, Boolean> ret = ImmutableMap.builder();
List<HeldPermission<UUID>> lookup = this.plugin.getStorage().getUsersWithPermission(permission).join();
List<HeldPermission<UUID>> lookup = this.plugin.getStorage().getUsersWithPermission(Constraint.of(StandardComparison.EQUAL, permission)).join();
for (HeldPermission<UUID> 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<SpongeUser> implement
return CompletableFuture.supplyAsync(() -> {
ImmutableMap.Builder<LPSubjectReference, Boolean> ret = ImmutableMap.builder();
List<HeldPermission<UUID>> lookup = this.plugin.getStorage().getUsersWithPermission(permission).join();
List<HeldPermission<UUID>> lookup = this.plugin.getStorage().getUsersWithPermission(Constraint.of(StandardComparison.EQUAL, permission)).join();
for (HeldPermission<UUID> holder : lookup) {
if (holder.asNode().getFullContexts().equals(contexts)) {
ret.put(getService().getReferenceFactory().obtain(getIdentifier(), holder.getHolder().toString()), holder.getValue());