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

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

Refs #3 - Ven.save() is transferred to the new package. Save use case is completed. Convert.toDB() converts camel case object names to database names with underscores. Unchecked VenException is thrown by Ven methods. Liquibase changelog (test-db-changelog.xml) is changed to include only a simple object to test save operation. It creates a sample database table and inserts a sample row. On rollback it removes sample data. Using liquibase, Sample.java builds database, tests save operation and rolls back.

QueryGenerator generates insert and update queries for save and generates sequence query to assign ids to new objects. Ven calls query generator and runs the query using spring jdbc template.

Old codebase updated to run at Java 1.4

File size: 8.8 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(Cevir.isim(alanSinifi.getName()));//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(Cevir.isim(cokluAlandakiNesneSinifi.getName()));//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 = Cevir.isim(nesneSinifi.getName());
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 = Cevir.isim(nesneSinifi.getName());
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 = Cevir.isim(nesne.getClass().getName());
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.