[hibernate-issues] [JIRA] (HSEARCH-3325) Search 6 groundwork - Restore support for full-text filters
Waldemar Kłaczyński (JIRA)
jira at hibernate.atlassian.net
Sat Mar 28 19:34:51 EDT 2020
Waldemar Kłaczyński ( https://hibernate.atlassian.net/secure/ViewProfile.jspa?accountId=557058%3A77e50cac-bda3-4af4-9bb3-6461f4d10eea ) *commented* on HSEARCH-3325 ( https://hibernate.atlassian.net/browse/HSEARCH-3325?atlOrigin=eyJpIjoiMGUzYzc2NjdiNjgxNDQyMDk0ZTc2NmViYjU0NTRjYjkiLCJwIjoiaiJ9 )
Re: Search 6 groundwork - Restore support for full-text filters ( https://hibernate.atlassian.net/browse/HSEARCH-3325?atlOrigin=eyJpIjoiMGUzYzc2NjdiNjgxNDQyMDk0ZTc2NmViYjU0NTRjYjkiLCJwIjoiaiJ9 )
Another interesting solution for filters built in this way. It is possible to define a filter in a set with a binding field.
public class PermissionsBinder implements TypeBinder {
private String fieldName = "permissions" ;
private String operationName = "read" ;
public PermissionsBinder fieldName( String fieldName) {
this.fieldName = fieldName;
return this ;
}
public PermissionsBinder operationName( String operationName) {
this.operationName = operationName;
return this ;
}
@Override
public void bind(TypeBindingContext context) {
context.getDependencies().useRootOnly();
IndexFieldReference< String > permissionsField = context.getIndexSchemaElement()
.field( this.fieldName, f -> f.asString().analyzer( "permissions" ))
.toReference();
context.getIndexSchemaElement().filter( "is-permission" , new Filter())
.param( "operation" , operationName)
.param( "field" , this.fieldName)
.toReference();
context.setBridge( new Bridge(
permissionsField
));
}
private static class Bridge implements TypeBridge {
private final IndexFieldReference< String > permissionsField;
protected IdentityStoreResolver getIdentityService() {
IdentityStoreResolver isr = ServiceLocator.getService(IdentityStoreResolver.class, IdentityStoreResolver.JNDI_NAME);
return isr;
}
private Bridge(IndexFieldReference< String > permissionsField) {
this.permissionsField = permissionsField;
}
@Override
public void write(DocumentElement target, Object bridgedElement, TypeBridgeWriteContext context) {
StringBuilder brules = new StringBuilder();
IdentityStoreResolver isr = getIdentityService();
PermissionManager pm = isr.getPermissionManager();
List<Permission> permissions = pm.listPermissions(bridgedElement);
for (Permission permission : permissions) {
IdentityType assignee = permission.getAssignee();
if (assignee instanceof Group) {
String [] roles = permission.getRoles();
if (roles == null || roles.length < 1) {
roles = new String []{ "*" };
}
for ( String role : roles) {
brules.append(permission.getOperation()).append( ":" );
brules.append(permission.getContext()).append( ":" );
brules.append(permission.getPath()).append( ":" );
brules.append(role);
brules.append( "\n" );
}
} else {
brules.append(permission.getOperation()).append( ":" );
brules.append(permission.getContext()).append( ":" );
brules.append(permission.getPath());
brules.append( "\n" );
}
}
target.addValue( this.permissionsField, brules.toString());
}
}
private static class Filter implements FilterFactory {
@Override
public SearchPredicate create(FilterFactoryContext ctx) {
SearchPredicate filter;
SearchPredicateFactory predicate = ctx.predicate();
Account user = ctx.param( "user" );
String fieldPath = ctx.resolvePath(ctx.param( "field" ));
String operation = ctx.param( "operation" );
if (operation == null ) {
operation = "read" ;
}
PermissionQuery query = new PermissionQuery(fieldPath, operation, user);
filter = predicate.extension(LuceneExtension.get())
.fromLuceneQuery(query)
.toPredicate();
return filter;
}
}
}
( https://hibernate.atlassian.net/browse/HSEARCH-3325#add-comment?atlOrigin=eyJpIjoiMGUzYzc2NjdiNjgxNDQyMDk0ZTc2NmViYjU0NTRjYjkiLCJwIjoiaiJ9 ) Add Comment ( https://hibernate.atlassian.net/browse/HSEARCH-3325#add-comment?atlOrigin=eyJpIjoiMGUzYzc2NjdiNjgxNDQyMDk0ZTc2NmViYjU0NTRjYjkiLCJwIjoiaiJ9 )
Get Jira notifications on your phone! Download the Jira Cloud app for Android ( https://play.google.com/store/apps/details?id=com.atlassian.android.jira.core&referrer=utm_source%3DNotificationLink%26utm_medium%3DEmail ) or iOS ( https://itunes.apple.com/app/apple-store/id1006972087?pt=696495&ct=EmailNotificationLink&mt=8 ) This message was sent by Atlassian Jira (v1001.0.0-SNAPSHOT#100122- sha1:38c716d )
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/hibernate-issues/attachments/20200328/e230bf29/attachment.html
More information about the hibernate-issues
mailing list