source: subversion/sites/www.openstreetbrowser.org/src/wiki_data_conf.php @ 19823

Revision 19823, 4.6 KB checked in by skunk, 4 years ago (diff)

XML List: Don't let it confuse by null-values

Line 
1<?
2require_once("conf.php");
3require_once("src/wiki_stuff.php");
4
5$columns=array(
6  "Categories"=>array("category", "bg-color", "fg-color", "overlay"),
7  "Values"=>array("keys", "desc", "category", "importance", "icon", "overlay", "more"),
8  "Importance"=>array("key", "onlyicon", "icontext")
9);
10
11$wiki_data=read_wiki();
12$list_category=array();
13$list_importance=array();
14$columns=array();
15$req=array();
16
17foreach($wiki_data[Importance] as $wd) {
18  $list_importance[]=$wd[key];
19}
20
21foreach($wiki_data["Categories"] as $src) {
22  $list_category[]=$src[category];
23}
24
25function parse_src_more($str) {
26  $ret=array();
27
28  $es=explode(" ", $str);
29  foreach($es as $e) {
30    if(preg_match("/^([^=]+)=(.*)$/", $e, $m))
31      $ret[$m[1]]=$m[2];
32  }
33
34  return $ret;
35}
36
37$imp_match=array();
38foreach($wiki_data["Values"] as $src) {
39  $list_columns=array();
40  $l=parse_wholekey($src[keys], &$list_columns);
41
42  $r="'$src[desc]||";
43  if(eregi("^\[\[(.*)\.svg\]\]", $src[icon], $m))
44    $src[icon]="[[$m[1].png]]";
45  $r.="$src[icon]";
46  $r1=array();
47  foreach($list_columns as $key=>$values) {
48    $r1[]="$key='||(CASE WHEN \"$key\" is null THEN '' ELSE \"$key\" END)||'";
49  }
50  $r.="||".implode(" ", $r1)."'";
51
52  $prior=9;
53  if(eregi("\(([0-9]+)\)", $src[overlay], $m))
54    $prior=$m[1];
55
56  if($src[importance]=="*") {
57    $importance=$list_importance;
58  }
59  else
60    $importance=array($src[importance]);
61
62  $more=parse_src_more($src[more]);
63  $tables=array("polygon", "point");
64  if($more[tables]) {
65    $tables=explode(",", $more[tables]);
66  }
67
68  foreach($tables as $t) {
69    foreach($importance as $imp)
70      if($l)
71        $req[$src['category']][$imp][$t]['case'][$prior][]="WHEN $l THEN $r";
72      else
73        $req[$src['category']][$imp][$t]['case'][$prior][]=1;
74
75    if($src[importance]=="*") {
76      if(!$columns_all[$src[category]][$t])
77        $columns_all[$src[category]][$t]=array();
78      $columns_all[$src[category]][$t]=array_merge_recursive($columns_all[$src[category]][$t], $list_columns);
79    }
80    else {
81      if(!$columns[$src[category]][$imp][$t])
82        $columns[$src[category]][$imp][$t]=array();
83      $columns[$src[category]][$imp][$t]=array_merge_recursive($columns[$src[category]][$imp][$t], $list_columns);
84    }
85  }
86
87}
88
89$res=array();
90foreach($req as $category=>$d1) {
91  foreach($d1 as $importance=>$d2) {
92    foreach($d2 as $tables=>$d4) {
93      $d3=$d4['case'];
94      $d3_sort=array_keys($d3);
95      sort($d3_sort);
96      $ret="";
97      foreach($d3_sort as $p) {
98        $sqlstr=$d3[$p];
99        $ret.=implode("\n", $sqlstr);
100      }
101      $res[$category][$importance][$tables]['case']=$ret;
102    }
103  }
104
105  if($columns[$category]) {
106    $cols=array_keys($columns[$category]);
107    $ret1=array();
108    foreach($columns[$category] as $importance=>$d2) {
109      foreach($d2 as $tables=>$d3) {
110        foreach($d3 as $col=>$vals) {
111          $res[$category][$importance][$tables]['columns'][$col]=$vals;
112          // if all values are "positive" (no 'not null' and no 'not in (...)')
113          // then we can make use of indices
114          $pos=true;
115          foreach($vals as $v) {
116            if((substr($v, 0, 1)=="!")||($v=="*")) {
117              $pos=false;
118            }
119          }
120
121          if($pos)
122            $res[$category][$importance][$tables]['where'][]="\"$col\" in ('".implode("', '", $vals)."')";
123        }
124      }
125    }
126  }
127
128  if($columns_all[$category]) {
129    $cols=array_keys($columns_all[$category]);
130    $ret1=array();
131    foreach($columns_all[$category] as $tables=>$d2) {
132      foreach($list_importance as $importance) {
133        $res[$category][$importance][$tables]['where_imp']=array();
134        foreach($d2 as $col=>$vals) {
135          $res[$category][$importance][$tables]['columns'][$col]=$vals;
136          $res[$category][$importance][$tables]['where_imp'][]="\"$col\" in ('".implode("', '", $vals)."')";
137        }
138      }
139    }
140  }
141
142  $res[$category][sql_where]=array();
143  foreach($ret1 as $t=>$ret2) {
144    if(sizeof($ret2))
145      $res[$category][sql_where][$t][]=implode(" OR ", $ret2);
146    if($imp_match[$category])
147      $res[$category][sql_where][$t][]="importance='%importance%'";
148    $res[$category][sql_where][$t]=implode(" and ", $res[$category][sql_where][$t]);
149  }
150}
151
152function to_cat_list($cat_list, $cat_part) {
153  $t=$cat_part[0];
154  array_shift($cat_part);
155
156  if(!$cat_list[$t])
157    $cat_list[$t]=array();
158 
159  if(sizeof($cat_part))
160    to_cat_list(&$cat_list[$t], $cat_part);
161}
162
163$f=fopen("request.save", "w");
164fwrite($f, serialize($res));
165fclose($f);
166
167$overlays=array();
168
169foreach($wiki_data[Categories] as $cat=>$data) {
170  $cat_part=explode("/", $data[category]);
171  to_cat_list(&$cat_list, $cat_part);
172
173  if($data[overlay]) {
174    $overlays[$data[category]]=$data[overlay];
175  }
176}
177
178$f=fopen("category_list.save", "w");
179fwrite($f, serialize($cat_list));
180fclose($f);
181
182$f=fopen("overlays.save", "w");
183fwrite($f, serialize($overlays));
184fclose($f);
Note: See TracBrowser for help on using the repository browser.