Skip to content

Commit 04fc82d

Browse files
committed
HSEARCH-3784 Simplify the handling of tenant ID filters in Lucene
The previous approach was getting in the way of the next commits.
1 parent a9ff024 commit 04fc82d

File tree

10 files changed

+36
-38
lines changed

10 files changed

+36
-38
lines changed

backend/lucene/src/main/java/org/hibernate/search/backend/lucene/multitenancy/impl/DiscriminatorMultiTenancyStrategy.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
import org.hibernate.search.backend.lucene.logging.impl.Log;
1313
import org.hibernate.search.backend.lucene.search.impl.LuceneQueries;
1414
import org.hibernate.search.backend.lucene.util.impl.LuceneFields;
15-
import org.hibernate.search.backend.lucene.work.impl.LuceneQueryBasedDeleteAllEntriesWork;
15+
import org.hibernate.search.backend.lucene.work.impl.LuceneQueryBasedDeleteWork;
1616
import org.hibernate.search.backend.lucene.work.impl.LuceneQueryBasedDeleteEntryWork;
1717
import org.hibernate.search.backend.lucene.work.impl.LuceneQueryBasedUpdateEntryWork;
1818
import org.hibernate.search.util.common.reporting.EventContext;
@@ -36,8 +36,8 @@ public void contributeToIndexedDocument(Document document, String tenantId) {
3636
}
3737

3838
@Override
39-
public Query decorateLuceneQuery(Query originalLuceneQuery, String tenantId) {
40-
return LuceneQueries.wrapWithDiscriminatorTenantIdQuery( originalLuceneQuery, tenantId );
39+
public Query getFilterOrNull(String tenantId) {
40+
return LuceneQueries.tenantIdQuery( tenantId );
4141
}
4242

4343
@Override
@@ -52,8 +52,8 @@ public LuceneQueryBasedDeleteEntryWork createDeleteEntryLuceneWork(String tenant
5252
}
5353

5454
@Override
55-
public LuceneQueryBasedDeleteAllEntriesWork createDeleteAllEntriesLuceneWork(String tenantId) {
56-
return new LuceneQueryBasedDeleteAllEntriesWork( tenantId );
55+
public LuceneQueryBasedDeleteWork createDeleteAllEntriesLuceneWork(String tenantId) {
56+
return new LuceneQueryBasedDeleteWork( tenantId );
5757
}
5858

5959
@Override

backend/lucene/src/main/java/org/hibernate/search/backend/lucene/multitenancy/impl/MultiTenancyStrategy.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,10 @@ public interface MultiTenancyStrategy {
3838
/**
3939
* Decorate the query with the tenant constraint.
4040
*
41-
* @param originalLuceneQuery The original Lucene query.
4241
* @param tenantId The tenant id.
4342
* @return The decorated query.
4443
*/
45-
Query decorateLuceneQuery(Query originalLuceneQuery, String tenantId);
44+
Query getFilterOrNull(String tenantId);
4645

4746
/**
4847
* Check that the tenant id value is consistent with the strategy.

backend/lucene/src/main/java/org/hibernate/search/backend/lucene/multitenancy/impl/NoMultiTenancyStrategy.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ public void contributeToIndexedDocument(Document document, String tenantId) {
3333
}
3434

3535
@Override
36-
public Query decorateLuceneQuery(Query originalLuceneQuery, String tenantId) {
37-
return originalLuceneQuery;
36+
public Query getFilterOrNull(String tenantId) {
37+
return null;
3838
}
3939

4040
@Override

backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/impl/LuceneQueries.java

Lines changed: 6 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -34,19 +34,14 @@ public static Query nestedDocumentPathQuery(String absoluteFieldPath) {
3434
return new TermQuery( new Term( LuceneFields.nestedDocumentPathFieldName(), absoluteFieldPath ) );
3535
}
3636

37-
public static Query discriminatorMultiTenancyDeleteDocumentQuery(String tenantId, String id) {
38-
return wrapWithDiscriminatorTenantIdQuery( new TermQuery( new Term( LuceneFields.idFieldName(), id ) ), tenantId );
37+
public static Query singleDocumentQuery(String tenantId, String id) {
38+
BooleanQuery.Builder queryBuilder = new BooleanQuery.Builder();
39+
queryBuilder.add( new TermQuery( new Term( LuceneFields.idFieldName(), id ) ), Occur.MUST );
40+
queryBuilder.add( tenantIdQuery( tenantId ), Occur.FILTER );
41+
return queryBuilder.build();
3942
}
4043

41-
public static Query discriminatorMultiTenancyDeleteAllDocumentsQuery(String tenantId) {
44+
public static Query tenantIdQuery(String tenantId) {
4245
return new TermQuery( new Term( LuceneFields.tenantIdFieldName(), tenantId ) );
4346
}
44-
45-
public static Query wrapWithDiscriminatorTenantIdQuery(Query originalLuceneQuery, String tenantId) {
46-
BooleanQuery.Builder queryBuilder = new BooleanQuery.Builder();
47-
queryBuilder.add( originalLuceneQuery, Occur.MUST );
48-
queryBuilder.add( new TermQuery( new Term( LuceneFields.tenantIdFieldName(), tenantId ) ), Occur.FILTER );
49-
50-
return queryBuilder.build();
51-
}
5247
}

backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/impl/LuceneSearchContext.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,8 +72,8 @@ public Set<? extends ReadIndexManagerContext> getIndexManagerContexts() {
7272
return scopeModel.getIndexManagerContexts();
7373
}
7474

75-
public Query decorateLuceneQuery(Query originalLuceneQuery, String tenantId) {
76-
return multiTenancyStrategy.decorateLuceneQuery( originalLuceneQuery, tenantId );
75+
public Query getFilterOrNull(String tenantId) {
76+
return multiTenancyStrategy.getFilterOrNull( tenantId );
7777
}
7878

7979
public TimeoutManager createTimeoutManager(Query definitiveLuceneQuery,

backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/impl/LuceneSearchQueryBuilder.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
import org.hibernate.search.engine.search.query.spi.SearchQueryBuilder;
3838
import org.hibernate.search.util.common.logging.impl.LoggerFactory;
3939

40+
import org.apache.lucene.search.BooleanClause;
4041
import org.apache.lucene.search.BooleanClause.Occur;
4142
import org.apache.lucene.search.BooleanQuery;
4243
import org.apache.lucene.search.Query;
@@ -168,15 +169,18 @@ public LuceneSearchQuery<H> build() {
168169
luceneQueryBuilder.add( luceneQuery, Occur.MUST );
169170
luceneQueryBuilder.add( LuceneQueries.mainDocumentQuery(), Occur.FILTER );
170171

172+
Query filter = searchContext.getFilterOrNull( sessionContext.getTenantIdentifier() );
173+
if ( filter != null ) {
174+
luceneQueryBuilder.add( filter, BooleanClause.Occur.FILTER );
175+
}
176+
177+
Query definitiveLuceneQuery = luceneQueryBuilder.build();
178+
171179
Sort luceneSort = null;
172180
if ( sortFields != null && !sortFields.isEmpty() ) {
173181
luceneSort = new Sort( sortFields.toArray( new SortField[0] ) );
174182
}
175183

176-
Query definitiveLuceneQuery = searchContext.decorateLuceneQuery(
177-
luceneQueryBuilder.build(), sessionContext.getTenantIdentifier()
178-
);
179-
180184
if ( nestedFieldSorts != null ) {
181185
for ( LuceneFieldComparatorSource nestedField : nestedFieldSorts ) {
182186
nestedField.setOriginalParentQuery( definitiveLuceneQuery );

backend/lucene/src/main/java/org/hibernate/search/backend/lucene/search/query/impl/LuceneSearchQueryImpl.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -154,16 +154,16 @@ private <T> T doSubmit(LuceneReadWork<T> work) {
154154

155155
private Explanation doExplain(String indexName, String id) {
156156
timeoutManager.start();
157-
Query explainedDocumentQuery = new BooleanQuery.Builder()
157+
BooleanQuery.Builder explainedDocumentQueryBuilder = new BooleanQuery.Builder()
158158
.add( new TermQuery( new Term( LuceneFields.indexFieldName(), indexName ) ), BooleanClause.Occur.MUST )
159-
.add( new TermQuery( new Term( LuceneFields.idFieldName(), id ) ), BooleanClause.Occur.MUST )
160-
.build();
161-
explainedDocumentQuery = searchContext.decorateLuceneQuery(
162-
explainedDocumentQuery, sessionContext.getTenantIdentifier()
163-
);
159+
.add( new TermQuery( new Term( LuceneFields.idFieldName(), id ) ), BooleanClause.Occur.MUST );
160+
Query filter = searchContext.getFilterOrNull( sessionContext.getTenantIdentifier() );
161+
if ( filter != null ) {
162+
explainedDocumentQueryBuilder.add( filter, BooleanClause.Occur.FILTER );
163+
}
164164

165165
LuceneReadWork<Explanation> work = workFactory.explain(
166-
searcher, indexName, id, explainedDocumentQuery
166+
searcher, indexName, id, explainedDocumentQueryBuilder.build()
167167
);
168168
Explanation explanation = doSubmit( work );
169169
timeoutManager.stop();

backend/lucene/src/main/java/org/hibernate/search/backend/lucene/work/impl/LuceneQueryBasedDeleteEntryWork.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public LuceneQueryBasedDeleteEntryWork(String tenantId, String id) {
2121
@Override
2222
protected long doDeleteDocuments(IndexWriterDelegator indexWriterDelegator, String tenantId, String id) throws IOException {
2323
return indexWriterDelegator.deleteDocuments(
24-
LuceneQueries.discriminatorMultiTenancyDeleteDocumentQuery( tenantId, id )
24+
LuceneQueries.singleDocumentQuery( tenantId, id )
2525
);
2626
}
2727
}
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,16 @@
1212
import org.hibernate.search.backend.lucene.search.impl.LuceneQueries;
1313

1414

15-
public class LuceneQueryBasedDeleteAllEntriesWork extends AbstractLuceneDeleteAllEntriesWork {
15+
public class LuceneQueryBasedDeleteWork extends AbstractLuceneDeleteAllEntriesWork {
1616

17-
public LuceneQueryBasedDeleteAllEntriesWork(String tenantId) {
17+
public LuceneQueryBasedDeleteWork(String tenantId) {
1818
super( tenantId );
1919
}
2020

2121
@Override
2222
protected long doDeleteDocuments(IndexWriterDelegator indexWriterDelegator, String tenantId) throws IOException {
2323
return indexWriterDelegator.deleteDocuments(
24-
LuceneQueries.discriminatorMultiTenancyDeleteAllDocumentsQuery( tenantId )
24+
LuceneQueries.tenantIdQuery( tenantId )
2525
);
2626
}
2727
}

backend/lucene/src/main/java/org/hibernate/search/backend/lucene/work/impl/LuceneQueryBasedUpdateEntryWork.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public LuceneQueryBasedUpdateEntryWork(String tenantId, String id, LuceneIndexEn
2222
@Override
2323
protected long doUpdateEntry(IndexWriterDelegator indexWriterDelegator, String tenantId, String id,
2424
LuceneIndexEntry indexEntry) throws IOException {
25-
indexWriterDelegator.deleteDocuments( LuceneQueries.discriminatorMultiTenancyDeleteDocumentQuery( tenantId, id ) );
25+
indexWriterDelegator.deleteDocuments( LuceneQueries.singleDocumentQuery( tenantId, id ) );
2626
return indexWriterDelegator.addDocuments( indexEntry );
2727
}
2828
}

0 commit comments

Comments
 (0)