source: trunk/fmgVen/src/net/fmg/ven/SorguUretici.java @ 13

Last change on this file since 13 was 11, checked in by fmguler, 16 years ago

FMG VEN kütüphanesi - ilk import

File size: 8.7 KB
Line 
1/*
2 * SorguUretici.java
3 *
4 * Created on December 18, 2006, 9:32 AM
5 * (4.12.06 tarihli SpringDaoDeneme çalýþmasýndan derlenmiþtir)
6 *
7 * Ven - Ayar Yerine Gelenek veritabaný eriþim nesnesi
8 */
9
10package net.fmg.ven;
11
12import java.beans.PropertyDescriptor;
13import java.util.ArrayList;
14import java.util.Date;
15import java.util.HashSet;
16import java.util.Iterator;
17import java.util.List;
18import java.util.Set;
19import net.fmg.ven.arac.Cevir;
20import net.fmg.ven.arac.SinifBildirenLinkedList;
21import org.springframework.beans.BeanWrapper;
22import org.springframework.beans.BeanWrapperImpl;
23
24/**
25 * Belirtilen sýnýfýn 'Ayar yerine gelenek' yaklaþýmýnda sorgusunu üretir
26 * @author Fatih Mehmet Güler
27 */
28public class SorguUretici {
29    private Set vtSiniflari;
30    private Set nesnePaketleri;
31    private Set baglar;
32    private String selectCumlesi;
33    private String fromCumlesi;
34   
35    /**
36     * Creates a new instance of SorguUretici
37     */
38    public SorguUretici() {
39        this.vtSiniflari = new HashSet();
40        this.nesnePaketleri = new HashSet();
41        this.vtSiniflari.add(Integer.class);
42        this.vtSiniflari.add(String.class);
43        this.vtSiniflari.add(Date.class);
44        this.vtSiniflari.add(Double.class);
45        this.vtSiniflari.add(Boolean.class);
46    }
47   
48    private void tekrarlayanSorguUret(int seviye, String tabloAdi, String nesneYolu, Class nesneSinifi, Set baglar, StringBuffer selectCumlesi, StringBuffer fromCumlesi){
49        BeanWrapper wr = new BeanWrapperImpl(nesneSinifi);
50        PropertyDescriptor[] pdArr = wr.getPropertyDescriptors();
51        for (int i = 0; i < pdArr.length; i++) {
52            Class alanSinifi = pdArr[i].getPropertyType(); //alan sýnýfý
53            String sutunAdi = Cevir.vt(pdArr[i].getName()); //sütun adý
54            String alanAdi = pdArr[i].getName(); //alan adý
55            if (vtSiniflari.contains(alanSinifi)){ //veritabaný direk alan (Integer,String,Date, vs)
56                selectCumlesi.append(tabloAdi+"."+sutunAdi+" as "+tabloAdi+"_"+sutunAdi); //sütun
57                selectCumlesi.append(", ");
58            }
59            if (alanSinifi.getPackage()!=null && nesnePaketleri.contains(alanSinifi.getPackage().getName()) && baglarKapsar(baglar,nesneYolu+"."+alanAdi)){ //domain nesnesi 1-1 join
60                String bagTablosuDigerAd = tabloAdi+"_"+sutunAdi; // bað tablosu için diðer ad, çünkü ayný isimde birden fazla bað olabilir, karýþmasýn
61                String bagTablosu = Cevir.vt(alanSinifi.getSimpleName());//gerçek bað tablosu
62                fromCumlesi.append(" left join "+bagTablosu+" "+bagTablosuDigerAd);
63                fromCumlesi.append(" on "+bagTablosuDigerAd+".no = "+tabloAdi+"."+sutunAdi+"_no");
64                tekrarlayanSorguUret(++seviye,bagTablosuDigerAd,nesneYolu+"."+alanAdi,alanSinifi,baglar,selectCumlesi,fromCumlesi);
65            }
66            if (wr.getPropertyValue(alanAdi) instanceof SinifBildirenLinkedList && baglarKapsar(baglar,nesneYolu+"."+alanAdi)){
67                Class cokluAlandakiNesneSinifi = (Class)wr.getPropertyValue(alanAdi+".nesneSinifi");
68                String bagTablosuDigerAd = tabloAdi+"_"+sutunAdi; // bað tablosu için diðer ad, çünkü ayný isimde birden fazla bað olabilir, karýþmasýn
69                String bagTablosu = Cevir.vt(cokluAlandakiNesneSinifi.getSimpleName());//gerçek bað tablosu
70                String bagAlani = Cevir.vt((String)wr.getPropertyValue(alanAdi+".bagAlani")); //YAP: bunu vermeden de varsayýlan birþey yapsýn
71                fromCumlesi.append(" left join "+bagTablosu+" "+bagTablosuDigerAd);
72                fromCumlesi.append(" on "+bagTablosuDigerAd+"."+bagAlani+"_no = "+tabloAdi+".no");
73                tekrarlayanSorguUret(++seviye,bagTablosuDigerAd,nesneYolu+"."+alanAdi,cokluAlandakiNesneSinifi,baglar,selectCumlesi,fromCumlesi);
74            }
75        }
76    }
77   
78    private boolean baglarKapsar(Set baglar, String bag){
79        Iterator it = baglar.iterator();
80        while (it.hasNext()) {
81            String str = (String) it.next();
82            if (str.startsWith(bag)){
83                if (str.length()==bag.length()) return true;
84                else if(str.charAt(bag.length())=='.') return true;
85            }
86        }
87        return false;
88    }
89   
90    /**
91     * Sql select sorgusu üretir
92     */
93    public String secmeSorgusuUret(Set baglar, Class nesneSinifi){
94        //long t1 = System.currentTimeMillis();
95        String nesneAdi = nesneSinifi.getSimpleName();
96        String tabloAdi = Cevir.vt(nesneAdi);
97        StringBuffer selectCumlesi = new StringBuffer("select ");
98        StringBuffer fromCumlesi = new StringBuffer("from "+tabloAdi);
99        tekrarlayanSorguUret(0,tabloAdi,nesneAdi,nesneSinifi,baglar,selectCumlesi,fromCumlesi);
100        selectCumlesi.append(" 1=1");
101        //System.out.println("Sorgu üretme zamaný="+(System.currentTimeMillis()-t1));       
102        return selectCumlesi.toString()+" \n"+fromCumlesi.toString();
103    }
104   
105    /**
106     * Sql select sorgusu üretir, ancak alanlarý almaz count(distinct tabloadi.no) alýr
107     */
108    public String saymaSorgusuUret(Set baglar, Class nesneSinifi){
109        //long t1 = System.currentTimeMillis();
110        String nesneAdi = nesneSinifi.getSimpleName();
111        String tabloAdi = Cevir.vt(nesneAdi);
112        StringBuffer selectCumlesi = new StringBuffer();
113        StringBuffer fromCumlesi = new StringBuffer("from "+tabloAdi);
114        tekrarlayanSorguUret(0,tabloAdi,nesneAdi,nesneSinifi,baglar,selectCumlesi,fromCumlesi);
115        //System.out.println("Sorgu üretme zamaný="+(System.currentTimeMillis()-t1));       
116        return "select count(distinct "+tabloAdi+".no) \n"+fromCumlesi.toString();
117    }
118   
119   
120    /**
121     * insert-update sorgusu üretir
122     */
123    public String guncellemeSorgusuUret(Object nesne){
124        BeanWrapper wr = new BeanWrapperImpl(nesne);
125        String nesneAdi = nesne.getClass().getSimpleName();
126        String tabloAdi = Cevir.vt(nesneAdi);
127        StringBuffer sorgu;
128        PropertyDescriptor[] pdArr = wr.getPropertyDescriptors();
129       
130        boolean yeni = wr.getPropertyValue("no")==null;
131        if (yeni){ //ekle
132            sorgu = new StringBuffer("insert into "+tabloAdi+"(");
133            StringBuffer degerler = new StringBuffer(" values(");
134            for (int i = 0; i < pdArr.length; i++) {
135                Class alanSinifi = pdArr[i].getPropertyType(); //alan sýnýfý
136                String sutunAdi = Cevir.vt(pdArr[i].getName()); //sütun adý
137                String alanAdi = pdArr[i].getName(); //alan adý
138                if (alanAdi.equals("no")) continue; //YAP: Belki squenci bozar, ama bozmuyosa kaldýr
139                if (vtSiniflari.contains(alanSinifi)){ //veritabaný direk alan (Integer,String,Date, vs)
140                    sorgu.append(sutunAdi);
141                    sorgu.append(",");
142                    degerler.append(":"+alanAdi);
143                    degerler.append(",");
144                }
145                if (alanSinifi.getPackage()!=null && nesnePaketleri.contains(alanSinifi.getPackage().getName())){ //nesne
146                    sorgu.append(Cevir.vt(alanAdi)+"_no");
147                    sorgu.append(",");
148                    degerler.append(":"+alanAdi+".no");
149                    degerler.append(",");
150                }
151            }
152            sorgu.deleteCharAt(sorgu.length()-1);
153            sorgu.append(")");
154            degerler.deleteCharAt(degerler.length()-1);
155            degerler.append(");");                   
156            sorgu.append(degerler);           
157           
158        }else{ //güncelle
159            sorgu = new StringBuffer("update "+tabloAdi+" set ");
160            for (int i = 0; i < pdArr.length; i++) {
161                Class alanSinifi = pdArr[i].getPropertyType(); //alan sýnýfý
162                String sutunAdi = Cevir.vt(pdArr[i].getName()); //sütun adý
163                String alanAdi = pdArr[i].getName(); //alan adý
164                if (vtSiniflari.contains(alanSinifi)){ //veritabaný direk alan (Integer,String,Date, vs)
165                    sorgu.append(sutunAdi+"=:"+alanAdi);
166                    sorgu.append(",");
167                }
168                if (alanSinifi.getPackage()!=null && nesnePaketleri.contains(alanSinifi.getPackage().getName())){ //nesne
169                    sorgu.append(sutunAdi+"_no=:"+alanAdi+".no");
170                    sorgu.append(",");
171                }
172            }
173            sorgu.deleteCharAt(sorgu.length()-1);
174            sorgu.append(" where no = :no ;"); //YAP: sonuncu virgülü sil
175        }
176        return sorgu.toString();
177    }
178   
179    public Set getNesnePaketleri() {
180        return nesnePaketleri;
181    }
182   
183    public void setNesnePaketleri(Set nesnePaketleri) {
184        this.nesnePaketleri = nesnePaketleri;
185    }
186}
Note: See TracBrowser for help on using the repository browser.