protected function mergeWithReference(AbstractMetaModel $metamodel, array $filters = NULL, $namespace, $sourceReferenceName, $sourceReference)
 {
     $referenceName = NameSpaceHelper::resolveNameSpace($namespace, $sourceReferenceName);
     $reference = $metamodel->findReference($referenceName);
     if (isset($reference)) {
         $metamodel->unregisterReference($referenceName);
     } else {
         $reference = new DatasetReference();
         $reference->name = $referenceName;
     }
     // reference[]/dataset/name
     foreach ($sourceReference as $pointIndex => $sourcePoint) {
         if (!isset($sourcePoint->datasetName)) {
             throw new IllegalStateException(t("'@referenceName' reference point definition (index: @pointIndex) does not contain a reference to dataset", array('@referenceName' => $referenceName, '@pointIndex' => $pointIndex)));
         }
         $datasetName = NameSpaceHelper::resolveNameSpace($namespace, $sourcePoint->datasetName);
         $referencePoint = $reference->initiatePoint();
         if (isset($sourcePoint->columnNames)) {
             foreach ($sourcePoint->columnNames as $columnName) {
                 $referencePointColumn = $referencePoint->initiateColumn();
                 $referencePointColumn->datasetName = $datasetName;
                 $referencePointColumn->columnName = $columnName;
                 $referencePoint->registerColumnInstance($referencePointColumn);
             }
         } else {
             $referencePointColumn = $referencePoint->initiateColumn();
             $referencePointColumn->datasetName = $datasetName;
             $referencePoint->registerColumnInstance($referencePointColumn);
         }
         $reference->registerPointInstance($referencePoint);
     }
     $metamodel->registerReference($reference);
     return $reference;
 }
    protected function mergeWithReference(AbstractMetaModel $metamodel, array $filters = NULL, $namespace, $sourceReferenceName, $sourceReference) {
        $referenceName = NameSpaceHelper::resolveNameSpace($namespace, $sourceReferenceName);

        $reference = $metamodel->findReference($referenceName);
        if (isset($reference)) {
            $metamodel->unregisterReference($referenceName);
        }
        else {
            $reference = new DatasetReference();
            $reference->name = $referenceName;
        }

        // reference[]/dataset/name
        foreach ($sourceReference as $pointIndex => $sourcePoint) {
            if (!isset($sourcePoint->datasetName)) {
                throw new IllegalStateException(t(
                    '%referenceName reference point definition (index: %pointIndex) does not contain a reference to dataset',
                    array('%referenceName' => $referenceName, '%pointIndex' => $pointIndex)));
            }

            $datasetName = NameSpaceHelper::resolveNameSpace($namespace, $sourcePoint->datasetName);
            // TODO eliminate the following check because we should allow reference definition in separate file which is processed before corresponding datasets are processed
            // at the same time we do not want to have references which point to 'missing' datasets
            // we can eliminate such references during final meta model validation
            if ($metamodel->findDataset($datasetName) == NULL) {
                continue;
            }

            $referencePoint = $reference->initiatePoint();
            if (isset($sourcePoint->columnNames)) {
                foreach ($sourcePoint->columnNames as $columnName) {
                    $referencePointColumn = $referencePoint->initiateColumn();
                    $referencePointColumn->datasetName = $datasetName;
                    $referencePointColumn->columnName = $columnName;
                    $referencePoint->registerColumnInstance($referencePointColumn);
                }
            }
            else {
                $referencePointColumn = $referencePoint->initiateColumn();
                $referencePointColumn->datasetName = $datasetName;
                $referencePoint->registerColumnInstance($referencePointColumn);
            }

            $reference->registerPointInstance($referencePoint);
        }

        $metamodel->registerReference($reference);

        return $reference;
    }