@@ -477,40 +477,55 @@ private function searchUsersByTypedValue(string $app, string $key, string|array
477477 $ this ->assertParams ('' , $ app , $ key , allowEmptyUser: true );
478478 $ this ->matchAndApplyLexiconDefinition ('' , $ app , $ key );
479479
480+ $ lexiconEntry = $ this ->getLexiconEntry ($ app , $ key );
481+ if ($ lexiconEntry ?->isFlagged(self ::FLAG_INDEXED ) === false ) {
482+ $ this ->logger ->notice ('UserConfig+Lexicon: using searchUsersByTypedValue on config key ' . $ app . '/ ' . $ key . ' which is not set as indexed ' );
483+ }
484+
480485 $ qb = $ this ->connection ->getQueryBuilder ();
481486 $ qb ->from ('preferences ' );
482487 $ qb ->select ('userid ' );
483488 $ qb ->where ($ qb ->expr ()->eq ('appid ' , $ qb ->createNamedParameter ($ app )));
484489 $ qb ->andWhere ($ qb ->expr ()->eq ('configkey ' , $ qb ->createNamedParameter ($ key )));
485490
486- // search within 'indexed' OR 'configvalue' only if 'flags' is set as not indexed
487- // TODO: when implementing config lexicon remove the searches on 'configvalue' if value is set as indexed
488491 $ configValueColumn = ($ this ->connection ->getDatabaseProvider () === IDBConnection::PLATFORM_ORACLE ) ? $ qb ->expr ()->castColumn ('configvalue ' , IQueryBuilder::PARAM_STR ) : 'configvalue ' ;
489492 if (is_array ($ value )) {
490- $ where = $ qb ->expr ()->orX (
491- $ qb ->expr ()->in ('indexed ' , $ qb ->createNamedParameter ($ value , IQueryBuilder::PARAM_STR_ARRAY )),
492- $ qb ->expr ()->andX (
493- $ qb ->expr ()->neq ($ qb ->expr ()->bitwiseAnd ('flags ' , self ::FLAG_INDEXED ), $ qb ->createNamedParameter (self ::FLAG_INDEXED , IQueryBuilder::PARAM_INT )),
494- $ qb ->expr ()->in ($ configValueColumn , $ qb ->createNamedParameter ($ value , IQueryBuilder::PARAM_STR_ARRAY ))
495- )
496- );
497- } else {
498- if ($ caseInsensitive ) {
493+ $ where = $ qb ->expr ()->in ('indexed ' , $ qb ->createNamedParameter ($ value , IQueryBuilder::PARAM_STR_ARRAY ));
494+ // in case lexicon does not exist for this key - or is not set as indexed - we keep searching for non-index entries if 'flags' is set as not indexed
495+ if ($ lexiconEntry ?->isFlagged(self ::FLAG_INDEXED ) !== true ) {
499496 $ where = $ qb ->expr ()->orX (
500- $ qb -> expr ()-> eq ( $ qb -> func ()-> lower ( ' indexed ' ), $ qb -> createNamedParameter ( strtolower ( $ value ))) ,
497+ $ where ,
501498 $ qb ->expr ()->andX (
502499 $ qb ->expr ()->neq ($ qb ->expr ()->bitwiseAnd ('flags ' , self ::FLAG_INDEXED ), $ qb ->createNamedParameter (self ::FLAG_INDEXED , IQueryBuilder::PARAM_INT )),
503- $ qb ->expr ()->eq ( $ qb -> func ()-> lower ( $ configValueColumn) , $ qb ->createNamedParameter (strtolower ( $ value) ))
500+ $ qb ->expr ()->in ( $ configValueColumn , $ qb ->createNamedParameter ($ value, IQueryBuilder:: PARAM_STR_ARRAY ))
504501 )
505502 );
503+ }
504+ } else {
505+ if ($ caseInsensitive ) {
506+ $ where = $ qb ->expr ()->eq ($ qb ->func ()->lower ('indexed ' ), $ qb ->createNamedParameter (strtolower ($ value )));
507+ // in case lexicon does not exist for this key - or is not set as indexed - we keep searching for non-index entries if 'flags' is set as not indexed
508+ if ($ lexiconEntry ?->isFlagged(self ::FLAG_INDEXED ) !== true ) {
509+ $ where = $ qb ->expr ()->orX (
510+ $ where ,
511+ $ qb ->expr ()->andX (
512+ $ qb ->expr ()->neq ($ qb ->expr ()->bitwiseAnd ('flags ' , self ::FLAG_INDEXED ), $ qb ->createNamedParameter (self ::FLAG_INDEXED , IQueryBuilder::PARAM_INT )),
513+ $ qb ->expr ()->eq ($ qb ->func ()->lower ($ configValueColumn ), $ qb ->createNamedParameter (strtolower ($ value )))
514+ )
515+ );
516+ }
506517 } else {
507- $ where = $ qb ->expr ()->orX (
508- $ qb ->expr ()->eq ('indexed ' , $ qb ->createNamedParameter ($ value )),
509- $ qb ->expr ()->andX (
510- $ qb ->expr ()->neq ($ qb ->expr ()->bitwiseAnd ('flags ' , self ::FLAG_INDEXED ), $ qb ->createNamedParameter (self ::FLAG_INDEXED , IQueryBuilder::PARAM_INT )),
511- $ qb ->expr ()->eq ($ configValueColumn , $ qb ->createNamedParameter ($ value ))
512- )
513- );
518+ $ where = $ qb ->expr ()->eq ('indexed ' , $ qb ->createNamedParameter ($ value ));
519+ // in case lexicon does not exist for this key - or is not set as indexed - we keep searching for non-index entries if 'flags' is set as not indexed
520+ if ($ lexiconEntry ?->isFlagged(self ::FLAG_INDEXED ) !== true ) {
521+ $ where = $ qb ->expr ()->orX (
522+ $ where ,
523+ $ qb ->expr ()->andX (
524+ $ qb ->expr ()->neq ($ qb ->expr ()->bitwiseAnd ('flags ' , self ::FLAG_INDEXED ), $ qb ->createNamedParameter (self ::FLAG_INDEXED , IQueryBuilder::PARAM_INT )),
525+ $ qb ->expr ()->eq ($ configValueColumn , $ qb ->createNamedParameter ($ value ))
526+ )
527+ );
528+ }
514529 }
515530 }
516531
@@ -1408,14 +1423,33 @@ public function updateGlobalIndexed(string $app, string $key, bool $indexed): vo
14081423 $ this ->assertParams ('' , $ app , $ key , allowEmptyUser: true );
14091424 $ this ->matchAndApplyLexiconDefinition ('' , $ app , $ key );
14101425
1411- foreach (array_keys ($ this ->getValuesByUsers ($ app , $ key )) as $ userId ) {
1412- try {
1413- $ this ->updateIndexed ($ userId , $ app , $ key , $ indexed );
1414- } catch (UnknownKeyException ) {
1415- // should not happen and can be ignored
1416- }
1426+ $ update = $ this ->connection ->getQueryBuilder ();
1427+ $ update ->update ('preferences ' )
1428+ ->where (
1429+ $ update ->expr ()->eq ('appid ' , $ update ->createNamedParameter ($ app )),
1430+ $ update ->expr ()->eq ('configkey ' , $ update ->createNamedParameter ($ key ))
1431+ );
1432+
1433+ // switching flags 'indexed' on and off is about adding/removing the bit value on the correct entries
1434+ if ($ indexed ) {
1435+ $ update ->set ('indexed ' , $ update ->func ()->substring ('configvalue ' , $ update ->createNamedParameter (1 , IQueryBuilder::PARAM_INT ), $ update ->createNamedParameter (64 , IQueryBuilder::PARAM_INT )));
1436+ $ update ->set ('flags ' , $ update ->func ()->add ('flags ' , $ update ->createNamedParameter (self ::FLAG_INDEXED , IQueryBuilder::PARAM_INT )));
1437+ $ update ->andWhere (
1438+ $ update ->expr ()->neq ($ update ->expr ()->castColumn (
1439+ $ update ->expr ()->bitwiseAnd ('flags ' , self ::FLAG_INDEXED ), IQueryBuilder::PARAM_INT ), $ update ->createNamedParameter (self ::FLAG_INDEXED , IQueryBuilder::PARAM_INT )
1440+ ));
1441+ } else {
1442+ // emptying field 'indexed' if key is not set as indexed anymore
1443+ $ update ->set ('indexed ' , $ update ->createNamedParameter ('' ));
1444+ $ update ->set ('flags ' , $ update ->func ()->subtract ('flags ' , $ update ->createNamedParameter (self ::FLAG_INDEXED , IQueryBuilder::PARAM_INT )));
1445+ $ update ->andWhere (
1446+ $ update ->expr ()->eq ($ update ->expr ()->castColumn (
1447+ $ update ->expr ()->bitwiseAnd ('flags ' , self ::FLAG_INDEXED ), IQueryBuilder::PARAM_INT ), $ update ->createNamedParameter (self ::FLAG_INDEXED , IQueryBuilder::PARAM_INT )
1448+ ));
14171449 }
14181450
1451+ $ update ->executeStatement ();
1452+
14191453 // we clear all cache
14201454 $ this ->clearCacheAll ();
14211455 }
0 commit comments