VersionPress\Utils\QueryLanguageUtils::createSqlRestrictionFromRule PHP Method

createSqlRestrictionFromRule() public static method

Example: rule = ['field' => ['value'], 'other_field' => ['with_prefix*']] output = (field = "value" AND other_field LIKE "with_prefix%")
public static createSqlRestrictionFromRule ( $rule ) : string
$rule array
return string
    public static function createSqlRestrictionFromRule($rule)
    {
        $restrictionParts = [];
        foreach ($rule as $field => $values) {
            $value = $values[0];
            // Use single value per field
            $valueTokens = self::tokenizeValue($value);
            $isWildcard = self::tokensContainWildcard($valueTokens);
            $searchedValue = self::tokensToSqlString($valueTokens);
            $operator = $isWildcard ? 'LIKE' : '=';
            $escapedValue = str_replace('"', '\\"', $searchedValue);
            if ($isWildcard) {
                $escapedValue = str_replace('_', '\\_', $escapedValue);
            }
            $restrictionPart = sprintf('`%s` %s "%s"', $field, $operator, $escapedValue);
            $restrictionParts[] = $restrictionPart;
        }
        return sprintf('(%s)', join(' AND ', $restrictionParts));
    }

Usage Example

function vp_save_frequently_written_entities($rules)
{
    global $versionPressContainer;
    /**
     * @var DbSchemaInfo $dbSchemaInfo
     * @var Database $database
     * @var WpdbMirrorBridge $wpdbMirrorBridge
     * @var StorageFactory $storageFactory
     */
    $dbSchemaInfo = $versionPressContainer->resolve(VersionPressServices::DB_SCHEMA);
    $database = $versionPressContainer->resolve(VersionPressServices::DATABASE);
    $wpdbMirrorBridge = $versionPressContainer->resolve(VersionPressServices::WPDB_MIRROR_BRIDGE);
    $storageFactory = $versionPressContainer->resolve(VersionPressServices::STORAGE_FACTORY);
    foreach ($rules as $entityName => $rulesWithInterval) {
        $storageFactory->getStorage($entityName)->ignoreFrequentlyWrittenEntities = false;
        $table = $dbSchemaInfo->getPrefixedTableName($entityName);
        foreach ($rulesWithInterval as $ruleAndInterval) {
            $restriction = QueryLanguageUtils::createSqlRestrictionFromRule($ruleAndInterval['rule']);
            $sql = "SELECT * FROM {$table} WHERE {$restriction}";
            $results = $database->get_results($sql, ARRAY_A);
            foreach ($results as $data) {
                $wpdbMirrorBridge->update($table, $data, $data);
            }
        }
    }
}
All Usage Examples Of VersionPress\Utils\QueryLanguageUtils::createSqlRestrictionFromRule