setDescription('Merge databox structure fields');
$this->addOption(
'source'
, 'f'
, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY
, 'Metadata structure ids for source'
, array()
);
$this->addOption(
'destination'
, 'd'
, InputOption::VALUE_REQUIRED
, 'Metadata structure id destination'
);
$this->addOption(
'sbas_id'
, 's'
, InputOption::VALUE_REQUIRED
, 'Databox sbas_id'
);
$this->addOption(
'separator'
, ''
, InputOption::VALUE_OPTIONAL
, 'Separator for concatenation (if destination is monovalued)'
, ';'
);
return $this;
}
public function execute(InputInterface $input, OutputInterface $output)
{
$output->writeln("");
if (!$input->getOption('sbas_id'))
throw new \Exception('Missing argument sbas_id');
try
{
$databox = \databox::get_instance((int) $input->getOption('sbas_id'));
}
catch (\Exception $e)
{
$output->writeln("Invalid databox id ");
return 1;
}
$sources = array();
foreach ($input->getOption('source') as $source_id)
{
$sources[] = $databox->get_meta_structure()->get_element($source_id);
}
if (count($sources) === 0)
throw new \Exception('No sources to proceed');
if (!$input->getOption('destination'))
throw new \Exception('Missing argument destination');
$separator = ' ' . $input->getOption('separator') . ' ';
$destination = $databox->get_meta_structure()->get_element($input->getOption('destination'));
$types = $multis = array();
foreach ($sources as $source)
{
array_push($types, $source->get_type());
array_push($multis, $source->is_multi());
}
$types = array_unique($types);
$multis = array_unique($multis);
if (count(array_unique($types)) > 1)
{
$output->writeln(
sprintf("Warning, trying to merge inconsistent types : %s\n"
, implode(', ', $types)
)
);
}
if (count(array_unique($multis)) > 1)
{
$output->writeln(
sprintf(
"Warning, trying to merge mono and multi values fields\n"
)
);
}
$field_names = array();
foreach ($sources as $source)
{
$field_names[] = $source->get_name();
}
if (count($multis) == 1)
{
if ($multis[0] === false && !$destination->is_multi())
{
$output->writeln(
sprintf(
"You are going to merge mono valued fields in a "
. "monovalued field, fields will be "
. "concatenated in the following order : %s"
, implode($separator, $field_names)
)
);
$this->displayHelpConcatenation($output);
}
elseif ($multis[0] === true && !$destination->is_multi())
{
$output->writeln(
sprintf(
"You are going to merge multi valued fields in a "
. "monovalued field, fields will be "
. "concatenated in the following order : %s"
, implode(' ', $field_names)
)
);
$this->displayHelpConcatenation($output);
}
elseif ($multis[0] === false && $destination->is_multi())
{
$output->writeln(
sprintf(
"You are going to merge mono valued fields in a "
. "multivalued field"
)
);
}
elseif ($multis[0] === true && $destination->is_multi())
{
$output->writeln(
sprintf(
"You are going to merge multi valued fields in a "
. "multivalued field"
)
);
}
}
elseif ($destination->is_multi())
{
$output->writeln(
sprintf(
"You are going to merge mixed valued fields in a "
. "multivalued field"
)
);
}
else
{
$output->writeln(
sprintf(
"You are going to merge mixed valued fields in a "
. "monovalued field, fields will be "
. "concatenated in the following order : %s"
, implode($separator, $field_names)
)
);
$this->displayHelpConcatenation($output);
}
$start = 0;
$quantity = 100;
do
{
$sql = 'SELECT record_id FROM record
ORDER BY record_id LIMIT ' . $start . ', ' . $quantity;
$stmt = $databox->get_connection()->prepare($sql);
$stmt->execute();
$results = $stmt->fetchAll(PDO::FETCH_ASSOC);
$stmt->closeCursor();
foreach ($results as $row)
{
$record = $databox->get_record($row['record_id']);
$datas = array();
foreach ($sources as $source)
{
try
{
$value = $record->get_caption()->get_field($source->get_name())->get_value();
}
catch (\Exception $e)
{
$value = array();
}
if (!is_array($value))
{
$value = array($value);
}
$datas = array_merge($datas, $value);
}
$datas = array_unique($datas);
if (!$destination->is_multi())
{
$datas = array(implode($separator, $datas));
}
try
{
$record->get_caption()->get_field($destination->get_name())->set_value($datas);
}
catch (\Exception $e)
{
$record->set_metadatas(
array(
array(
'meta_struct_id' => $destination->get_id()
, 'meta_id' => null
, 'value' => $datas
)
)
, true
);
}
unset($record);
}
$start += $quantity;
}
while (count($results) > 0);
return 0;
}
protected function displayHelpConcatenation(OutputInterface $output)
{
$output->writeln("\nYou can choose the concatenation order in the "
. "commandline (first option is first value) and set a separator "
. "with the --separator option)");
return $this;
}
}