Utils/SchemaUtils.php
author ymh <ymh.work@gmail.com>
Thu, 08 Dec 2011 23:48:55 +0100
changeset 58 87bf6ec8af90
parent 25 11fd79666374
permissions -rwxr-xr-x
add unsemantized status
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
25
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
<?php
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
/*
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
 * This file is part of the WikiTagBundle package.
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
 *
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
 * (c) IRI <http://www.iri.centrepompidou.fr/>
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
 *
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
 * For the full copyright and license information, please view the LICENSE
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
 * file that was distributed with this source code.
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
 */
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
namespace IRI\Bundle\WikiTagBundle\Utils;
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
use Mandango\Mondator\Definition\Definition;
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
use Mandango\Mondator\Definition\Property;
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
use Mandango\Mondator\Definition\Method;
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
use Mandango\Mondator\Dumper;
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
class SchemaUtils
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
{
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
    /**
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
     * The container for the service
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
     * @var unknown_type
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
     */
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
    protected $container;
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
    
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
    /**
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
     * Accessor for the container property.
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
     */
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
    public function getContainer()
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
    {
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
        return $this->container;
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
    }
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
    
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
    /**
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
     *
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
     * construct the shema utils service injects the container
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
     * @param unknown_type $container
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
     */
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
    public function __construct($container)
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
    {
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
       $this->container = $container;
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
    }
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
    
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
    
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
    
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
    /**
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
     * Return the sql to create the document table full text indexes
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
     * @return array
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
     */
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
    public function createFullTextIndexes()
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
    {
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
        $sql_code = array();
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
        $fields = $this->getContainer()->getParameter('wiki_tag.fields');
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
        $def_columns = array();
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
        foreach ( $fields as $name => $field_def)
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
        {
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
            if(isset($field_def['type']))
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
            {
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
                $type = $field_def['type'];
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
            }
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
            if(!isset($type) || is_null($type) || strlen($type) == 0)
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
            {
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
                $type = "text";
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
            }
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
        
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
            if($type === 'text')
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
            {
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
                $def_column = "$name(4096)";
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
            }
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
            else
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
            {
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
                $def_column = $name;
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
            }
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
            $def_columns[] = $def_column;
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
        
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
            $sql_code[] = "ALTER IGNORE TABLE wikitag_document DROP INDEX ${name}_document_fulltext_idx";
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
            $sql_code[] = "ALTER TABLE wikitag_document ADD FULLTEXT INDEX ${name}_document_fulltext_idx ($def_column)";
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
        }
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
        $sql_code[] = "ALTER IGNORE TABLE wikitag_document DROP INDEX tags_str_document_fulltext_idx";
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
        $sql_code[] = "ALTER TABLE wikitag_document ADD FULLTEXT INDEX tags_str_document_fulltext_idx (tags_str)";
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
        
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
        $sql_code[] = "ALTER IGNORE TABLE wikitag_document DROP INDEX all_document_fulltext_idx";
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
        $sql_code[] = "ALTER TABLE wikitag_document ADD FULLTEXT INDEX all_document_fulltext_idx (".join(",", $def_columns).")";
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
        
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
        return $sql_code;
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
        
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
    }
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
    
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
    public function filter_foreign_key(array $sqls)
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
    {
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
        $res_sqls = array();
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
        foreach ($sqls as $sql) {
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
            if(!preg_match("/ADD CONSTRAINT .+ FOREIGN KEY \(.*\) REFERENCES wikitag_document\(id\)/i", $sql))
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
            {
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
                $res_sqls[] = $sql;
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
            }
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
        }
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
        
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
        return $res_sqls;
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
        
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
    }
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
    
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
    public function filter_index_creation(array $sqls)
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
    {
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
        $res_sqls = array();
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
        
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
        $replace_regexps = array();
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
        
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
        $fields = $this->getContainer()->getParameter('wiki_tag.fields');
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
        $field_names = array();
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
        foreach ( $fields as $name => $field_def)
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
        {
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
            // create regular expression
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
            $replace_regexps[] = "/INDEX (${name}_document_fulltext_idx (?:ON wikitag_document ){0,1}\(${name}\))/";
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
            $field_names[] = " ?${name},?";
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
        }
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
        $field_names[] = " ?tags_str,?";
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
        $replace_regexps[] = "/INDEX (tags_str_document_fulltext_idx (?:ON wikitag_document ){0,1}\(tags_str\))/";
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
        $replace_regexps[] = "/INDEX (all_document_fulltext_idx (?:ON wikitag_document ){0,1}\((?:".implode("|",$field_names)."){".count($field_names)."}\))/";
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
        
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
        foreach($sqls as $sql)
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
        {
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
            if(strrpos($sql,"wikitag_document"))
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
            {
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
                $sql = preg_replace($replace_regexps, "FULLTEXT INDEX $1", $sql);
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
            }
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
            $res_sqls[] = $sql;
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
        }
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
        
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
        return $res_sqls;
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
    }
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
    
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
    public function generateDocumentClass()
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
    {
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
        $definition = new Definition('IRI\Bundle\WikiTagBundle\Entity\Document');
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
        
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
        $definition->setParentClass('\IRI\Bundle\WikiTagBundle\Model\Document');
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   139
        
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   140
        $fields = $this->getContainer()->getParameter('wiki_tag.fields');
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
        
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
        foreach ( $fields as $name => $field_def)
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
        {
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
            $property = new Property("private", $name, NULL);
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
            $definition->addProperty($property);
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
        
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   147
            $get_method = new Method("public", "get".ucfirst($name), NULL, <<<EOF
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   148
                        return \$this->$name;
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   149
EOF
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
            );
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
            $definition->addMethod($get_method);
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   152
        
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   153
            $set_method = new Method("public", "set".ucfirst($name), "\$$name", <<<EOF
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   154
                        \$this->$name = \$$name;
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   155
EOF
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   156
            );
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   157
            $definition->addMethod($set_method);
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   158
        
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   159
        }
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   160
        
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   161
        $dumper = new Dumper($definition);
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   162
        $classCode = $dumper->dump();
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   163
        
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   164
        return $classCode;
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   165
    }
11fd79666374 add missing files
ymh <ymh.work@gmail.com>
parents:
diff changeset
   166
}