/**
  * @param ClassMetadataInfo $metadata
  * @param string $outputDir
  * @param Closure $collectionNameBuilder
  */
 public function generate(ClassMetadataInfo $metadata, $outputDir, Closure $collectionNameBuilder)
 {
     $tpl = file_get_contents(CodeGeneratorHelper::absPath(EntityCollectionTemplate::class, RootPath::path()));
     $tplNs = CodeGeneratorHelper::ns(EntityCollectionTemplate::class);
     $tplSimpleName = CodeGeneratorHelper::simpleName(EntityCollectionTemplate::class);
     $entityFqcn = CodeGeneratorHelper::simpleName(EntityFqcn::class);
     $collectionClassName = $collectionNameBuilder($metadata->getName());
     $code = CodeGeneratorHelper::render($tpl, array($tplNs => CodeGeneratorHelper::ns($collectionClassName), $tplSimpleName => CodeGeneratorHelper::simpleName($collectionClassName), $entityFqcn => CodeGeneratorHelper::fqn($metadata->getName())));
     CodeGeneratorHelper::save($collectionClassName, $code, $outputDir);
 }
 protected function generateCondCodeBody($metadatas, ClassMetadataInfo $metadata)
 {
     $methods = [];
     foreach ($metadata->fieldMappings as $fieldMapping) {
         $columnName = $fieldMapping['columnName'];
         if (in_array($fieldMapping['type'], ['integer', 'datetime', 'boolean'])) {
             $methods[] = CodeGeneratorHelper::render($this->getMethodCodeByName(CondMethodBody::class, '____fieldNameScalar____'), array('fieldNameScalar' => $fieldMapping['fieldName'], 'ColumnName' => $columnName, 'OP' => '='), self::KEY_TEMPLATE);
         }
         if (in_array($fieldMapping['type'], ['string', 'guid', 'text'])) {
             $methods[] = CodeGeneratorHelper::render($this->getMethodCodeByName(CondMethodBody::class, '____fieldNameScalar____'), array('fieldNameScalar' => $fieldMapping['fieldName'], 'ColumnName' => $columnName, 'OP' => 'LIKE'), self::KEY_TEMPLATE);
         }
     }
     foreach ($metadata->embeddedClasses as $fieldName => $embeddedClass) {
     }
     foreach ($metadata->associationMappings as $associationMapping) {
         switch ($associationMapping['type']) {
             case ClassMetadataInfo::MANY_TO_ONE:
                 $fieldName = $associationMapping['fieldName'];
                 $targetEntity = CodeGeneratorHelper::fqn($associationMapping['targetEntity']);
                 $columnName = $associationMapping['joinColumns'][0]['name'];
                 $referenceColumnName = $associationMapping['joinColumns'][0]['referencedColumnName'];
                 $targetQueryCollection = CodeGeneratorHelper::fqn($this->helper->getQueryCollectionClassNameByEntityClass($targetEntity));
                 $getterName = CodeGeneratorHelper::getGetterNameByFieldName($this->getFieldNameByColumnName($metadatas, $targetEntity, $referenceColumnName));
                 $targetMetadata = CodeGeneratorHelper::findMetadataByClassName($metadatas, $targetEntity);
                 $methods[] = CodeGeneratorHelper::render($this->getMethodCodeByName(CondMethodBody::class, '____fieldNameManyToOne____'), array('fieldNameManyToOne' => $fieldName, 'ColumnName' => $columnName, 'FilterByEntityFullQualifiedClassName' => $targetEntity, 'QueryCollectionSimpleClassName' => $targetQueryCollection, 'OP' => '=', 'getterName' => $getterName, 'primaryKey' => CodeGeneratorHelper::getPrimaryKeyName($targetMetadata)), self::KEY_TEMPLATE);
                 break;
             case ClassMetadataInfo::ONE_TO_MANY:
                 break;
             case ClassMetadataInfo::MANY_TO_MANY:
                 break;
         }
     }
     return implode("\n", $methods);
 }