add : faster permalinks creation

fix : bad label escaping
This commit is contained in:
jygaulier
2020-11-18 11:12:16 +01:00
parent 9c804638fe
commit ebfaedb427
2 changed files with 32 additions and 30 deletions

View File

@@ -256,8 +256,7 @@ class BuildPermalinks extends Command
$s .= " WHERE " . $w;
}
$s .= " ORDER BY record_id ASC";
$sqlSelect = "SELECT s.record_id, s.subdef_id, s.name FROM " . $s;
$sqlSelect = "SELECT s.record_id, GROUP_CONCAT(s.subdef_id) AS subdef_ids FROM " . $s . " GROUP BY record_id";
if ($this->show_sql) {
$this->output->writeln($sqlSelect);
}
@@ -271,7 +270,6 @@ class BuildPermalinks extends Command
}
else {
$stmt = $this->connection->executeQuery($sqlSelect);
$record = $last_rid = null;
$time_start = microtime(true);
$duration = 0.0;
$n_created = 0;
@@ -279,12 +277,9 @@ class BuildPermalinks extends Command
$app = $this->getContainer();
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
$record_id = $row['record_id'];
$subdef_id = $row['subdef_id'];
$name = $row['name'];
if($record_id !== $last_rid) {
$last_rid = $record_id;
$subdef_ids = $row['subdef_ids'];
$record = $this->databox->get_record($record_id);
}
if($record) {
try {
/*
@@ -295,8 +290,8 @@ class BuildPermalinks extends Command
/*
* todo : use permalink adapter
*/
media_Permalink_Adapter::createFromRecord($app, $record, $subdef_id);
$n_created++;
$subdef_ids = explode(',', $subdef_ids);
$n_created += media_Permalink_Adapter::createFromRecord($app, $record, $subdef_ids);
}
catch (\Exception $e) {
// cant get record ? ignore
@@ -304,8 +299,7 @@ class BuildPermalinks extends Command
}
$duration = microtime(true) - $time_start ;
if($this->output->getVerbosity() >= OutputInterface::VERBOSITY_VERBOSE) {
$name = substr($name, 0, 20);
$lmax = max($lmax, strlen($msg = sprintf("rid: %-6s %-20s %10.1f\r", $record_id, $name, $n_created / $duration)));
$lmax = max($lmax, strlen($msg = sprintf("rid: %-6s %4.1f\r", $record_id, $n_created / $duration)));
$output->write($msg, $this->output->getVerbosity() >= OutputInterface::VERBOSITY_VERY_VERBOSE);
}
}
@@ -313,7 +307,7 @@ class BuildPermalinks extends Command
$output->write(str_repeat(' ', $lmax) . "\r"); // clear the line
$duration = max(.000001, $duration); // avoid division by 0 (anyway n_created is 0 in this case)
$output->writeln(sprintf("%s permalinks created in %.2f seconds : %.1f p/s", $n_created, $duration, $n_created / $duration ));
$output->writeln(sprintf("%s permalinks created in %.1f seconds : %.1f p/s", $n_created, $duration, $n_created / $duration ));
}
}

View File

@@ -377,35 +377,43 @@ class media_Permalink_Adapter implements cache_cacheableInterface
/**
* @param Application $app
* @param record_adapter $record
* @param int $subdef_id
* @throws DBALException
* @param int[] $subdef_ids
* @return int
*/
public static function createFromRecord(Application $app, record_adapter $record, $subdef_id)
public static function createFromRecord(Application $app, record_adapter $record, $subdef_ids)
{
/** @var Generator $generator */
$generator = $app['random.medium'];
/** @var unicode $unicode */
$unicode = $app['unicode'];
$params = [
'subdef_id' => $subdef_id,
'token' => $generator->generateString(64, TokenManipulator::LETTERS_AND_NUMBERS),
'label' => self::cleanLabel($unicode, $record->get_title(['removeExtension' => true])),
];
$connection = $record->getDatabox()->get_connection();
$n_created = 0;
// build a multi-rows insert
$inserts = '';
// constant part values
$insk = ", 1, NOW(), NOW(), " . $connection->quote(self::cleanLabel($unicode, $record->get_title(['removeExtension' => true])));
// multiple rows
foreach($subdef_ids as $subdef_id) {
$inserts .= ($inserts ? ',' : '') . '('
. $connection->quote($subdef_id) . ', '
. $connection->quote($generator->generateString(64, TokenManipulator::LETTERS_AND_NUMBERS))
. $insk . ')';
}
$sql = "INSERT INTO permalinks (subdef_id, token, activated, created_on, last_modified, label)\n"
. " VALUES (:subdef_id, :token, 1, NOW(), NOW(), :label)";
$statement = $connection->prepare($sql);
. " VALUES " . $inserts;
try {
$statement->execute($params);
$connection->exec($sql);
$n_created += count($subdef_ids);
}
catch (Exception $e) {
// we ignore this because somebody else might have created this plink
// between the test of "to be created" and here
}
$statement->closeCursor();
return $n_created;
}
/**
@@ -552,7 +560,7 @@ SQL;
private static function cleanLabel(unicode $unicode, $label)
{
$label = $unicode->remove_nonazAZ09(
preg_replace("/\\s\\s+/", '-', trim($label))
preg_replace("/\\s+/", '-', trim($label))
);
return $label ? $label : 'untitled';