11unit Ragna.Criteria.Impl;
2-
3- { $IF DEFINED(FPC)}
4- { $MODE DELPHI}{ $H+}
5- { $ENDIF}
6-
7- interface
8-
9- uses { $IFDEF UNIDAC} Uni{ $ELSE} FireDAC.Comp.Client, FireDAC.Stan.Param{ $ENDIF} ,
10- StrUtils, Data.DB, System.Hash, Ragna.Criteria.Intf, Ragna.Types;
11-
12- type
13- TDefaultCriteria = class (TInterfacedObject, ICriteria)
14- private
15- FQuery: { $IFDEF UNIDAC} TUniQuery{ $ELSE} TFDQuery{ $ENDIF} ;
16- procedure Where (const AField: string);
17- procedure &Or (const AField: string);
18- procedure &And (const AField: string);
19- procedure Like (const AValue: string);
20- procedure &Equals(const AValue: Int64); overload;
21- procedure &Equals(const AValue: Boolean); overload;
22- procedure &Equals(const AValue: string); overload;
23- procedure Order (const AField: string);
24- public
25- constructor Create(const AQuery: { $IFDEF UNIDAC} TUniQuery{ $ELSE} TFDQuery{ $ENDIF} );
26- end ;
27-
28- TManagerCriteria = class
29- private
30- FCriteria: ICriteria;
31- function GetDrive (const AQuery: { $IFDEF UNIDAC} TUniQuery{ $ELSE} TFDQuery{ $ENDIF} ): string;
32- function GetInstanceCriteria (const AQuery: { $IFDEF UNIDAC} TUniQuery{ $ELSE} TFDQuery{ $ENDIF} ): ICriteria;
33- public
34- constructor Create(const AQuery: { $IFDEF UNIDAC} TUniQuery{ $ELSE} TFDQuery{ $ENDIF} );
35- property Criteria: ICriteria read FCriteria write FCriteria;
36- end ;
37-
38- implementation
39-
40- uses FireDAC.Stan.Intf, SysUtils;
41-
42- procedure TDefaultCriteria .&And (const AField: string);
43- const
44- PHRASE = ' %s %s' ;
45- begin
46- FQuery.SQL.Add(Format(PHRASE, [TOperatorType.AND .ToString, AField]));
47- end ;
48-
49- procedure TDefaultCriteria .&Or (const AField: string);
50- const
51- PHRASE = ' %s %s' ;
52- begin
53- FQuery.SQL.Add(Format(PHRASE, [TOperatorType.OR .ToString, AField]));
54- end ;
55-
56- constructor TDefaultCriteria.Create(const AQuery: { $IFDEF UNIDAC} TUniQuery{ $ELSE} TFDQuery{ $ENDIF} );
57- begin
58- FQuery := AQuery;
59- end ;
60-
61- procedure TDefaultCriteria.Equals (const AValue: Boolean);
62- const
63- PHRASE = ' %s %s' ;
64- begin
65- FQuery.SQL.Add(Format(PHRASE, [TOperatorType.EQUALS.ToString, BoolToStr(AValue, True)]));
66- end ;
67-
68- procedure TDefaultCriteria.Equals (const AValue: Int64);
69- const
70- PHRASE = ' %s %d' ;
71- begin
72- FQuery.SQL.Add(Format(PHRASE, [TOperatorType.EQUALS.ToString, AValue]));
73- end ;
74-
75- procedure TDefaultCriteria.Equals (const AValue: string);
76- const
77- PHRASE = ' %s '' %s'' ' ;
78- begin
79- FQuery.SQL.Add(Format(PHRASE, [TOperatorType.EQUALS.ToString, AValue]));
80- end ;
81-
82- procedure TDefaultCriteria.Like (const AValue: string);
83- const
84- PHRASE = ' %s %s' ;
85- var
86- LKeyParam: string;
87- LParam: { $IFDEF UNIDAC} TUniParam{ $ELSE} TFDParam{ $ENDIF} ;
88- begin
89- LKeyParam := THashMD5.Create.HashAsString;
90- FQuery.SQL.Text := FQuery.SQL.Text + Format(PHRASE, [TOperatorType.LIKE.ToString, ' :' + LKeyParam]);
91- LParam := FQuery.ParamByName(LKeyParam);
92- LParam.DataType := ftString;
93- if Pos(' %' , AValue) <= 0 then
94- LParam.Value := AValue + ' %'
95- else
96- LParam.Value := AValue;
97- end ;
98-
99- procedure TDefaultCriteria.Where (const AField: string);
100- const
101- PHRASE = ' %s %s' ;
102- begin
103- FQuery.SQL.Add(Format(PHRASE, [TOperatorType.WHERE.ToString, AField]));
104- end ;
105-
106- procedure TDefaultCriteria.Order (const AField: string);
107- const
108- PHRASE = ' %s %s' ;
109- begin
110- FQuery.SQL.Add(Format(PHRASE, [TOperatorType.ORDER.ToString, AField]));
111- end ;
112-
113- constructor TManagerCriteria.Create(const AQuery: { $IFDEF UNIDAC} TUniQuery{ $ELSE} TFDQuery{ $ENDIF} );
114- begin
115- FCriteria := GetInstanceCriteria(AQuery);
116- end ;
117-
118- function TManagerCriteria.GetDrive (const AQuery: { $IFDEF UNIDAC} TUniQuery{ $ELSE} TFDQuery{ $ENDIF} ): string;
119- { $IFDEF UNIDAC}
120- begin
121- Result := AQuery.Connection.ProviderName;
122- end ;
123- { $ELSE}
124- var
125- LDef: IFDStanConnectionDef;
126- begin
127- Result := AQuery.Connection.DriverName;
128- if Result.IsEmpty and not AQuery.Connection.ConnectionDefName.IsEmpty then
129- begin
130- LDef := FDManager.ConnectionDefs.FindConnectionDef(AQuery.Connection.ConnectionDefName);
131- if LDef = nil then
132- raise Exception.Create(' ConnectionDefs "' + AQuery.Connection.ConnectionDefName + ' " not found' );
133- Result := LDef.Params.DriverID;
134- end ;
135- end ;
136- { $ENDIF}
137-
138- function TManagerCriteria.GetInstanceCriteria (const AQuery: { $IFDEF UNIDAC} TUniQuery{ $ELSE} TFDQuery{ $ENDIF} ): ICriteria;
139- begin
140- case AnsiIndexStr(GetDrive(AQuery), [' PG' ]) of
141- 0 :
142- Result := TDefaultCriteria.Create(AQuery);
143- else
144- Result := TDefaultCriteria.Create(AQuery);
145- end ;
146- end ;
147-
2+
3+ { $IF DEFINED(FPC)}
4+ { $MODE DELPHI}{ $H+}
5+ { $ENDIF}
6+
7+ interface
8+
9+ uses { $IFDEF UNIDAC} Uni{ $ELSE} FireDAC.Comp.Client, FireDAC.Stan.Param{ $ENDIF} ,
10+ StrUtils, Data.DB, System.Hash, Ragna.Criteria.Intf, Ragna.Types;
11+
12+ type
13+ TDefaultCriteria = class (TInterfacedObject, ICriteria)
14+ private
15+ FQuery: { $IFDEF UNIDAC} TUniQuery{ $ELSE} TFDQuery{ $ENDIF} ;
16+ procedure Where (const AField: string);
17+ procedure &Or (const AField: string);
18+ procedure &And (const AField: string);
19+ procedure Like (const AValue: string);
20+ procedure &Equals(const AValue: Int64); reintroduce; overload;
21+ procedure &Equals(const AValue: Boolean); reintroduce; overload;
22+ procedure &Equals(const AValue: string); reintroduce; overload;
23+ procedure Order (const AField: string);
24+ public
25+ constructor Create(const AQuery: { $IFDEF UNIDAC} TUniQuery{ $ELSE} TFDQuery{ $ENDIF} );
26+ end ;
27+
28+ TManagerCriteria = class
29+ private
30+ FCriteria: ICriteria;
31+ function GetDrive (const AQuery: { $IFDEF UNIDAC} TUniQuery{ $ELSE} TFDQuery{ $ENDIF} ): string;
32+ function GetInstanceCriteria (const AQuery: { $IFDEF UNIDAC} TUniQuery{ $ELSE} TFDQuery{ $ENDIF} ): ICriteria;
33+ public
34+ constructor Create(const AQuery: { $IFDEF UNIDAC} TUniQuery{ $ELSE} TFDQuery{ $ENDIF} );
35+ property Criteria: ICriteria read FCriteria write FCriteria;
36+ end ;
37+
38+ implementation
39+
40+ uses FireDAC.Stan.Intf, SysUtils;
41+
42+ procedure TDefaultCriteria .&And (const AField: string);
43+ const
44+ PHRASE = ' %s %s' ;
45+ begin
46+ FQuery.SQL.Add(Format(PHRASE, [TOperatorType.AND .ToString, AField]));
47+ end ;
48+
49+ procedure TDefaultCriteria .&Or (const AField: string);
50+ const
51+ PHRASE = ' %s %s' ;
52+ begin
53+ FQuery.SQL.Add(Format(PHRASE, [TOperatorType.OR .ToString, AField]));
54+ end ;
55+
56+ constructor TDefaultCriteria.Create(const AQuery: { $IFDEF UNIDAC} TUniQuery{ $ELSE} TFDQuery{ $ENDIF} );
57+ begin
58+ FQuery := AQuery;
59+ end ;
60+
61+ procedure TDefaultCriteria.Equals (const AValue: Boolean);
62+ const
63+ PHRASE = ' %s %s' ;
64+ begin
65+ FQuery.SQL.Add(Format(PHRASE, [TOperatorType.EQUALS.ToString, BoolToStr(AValue, True)]));
66+ end ;
67+
68+ procedure TDefaultCriteria.Equals (const AValue: Int64);
69+ const
70+ PHRASE = ' %s %d' ;
71+ begin
72+ FQuery.SQL.Add(Format(PHRASE, [TOperatorType.EQUALS.ToString, AValue]));
73+ end ;
74+
75+ procedure TDefaultCriteria.Equals (const AValue: string);
76+ const
77+ PHRASE = ' %s '' %s'' ' ;
78+ begin
79+ FQuery.SQL.Add(Format(PHRASE, [TOperatorType.EQUALS.ToString, AValue]));
80+ end ;
81+
82+ procedure TDefaultCriteria.Like (const AValue: string);
83+ const
84+ PHRASE = ' %s %s' ;
85+ var
86+ LKeyParam: string;
87+ LParam: { $IFDEF UNIDAC} TUniParam{ $ELSE} TFDParam{ $ENDIF} ;
88+ begin
89+ LKeyParam := THashMD5.Create.HashAsString;
90+ FQuery.SQL.Text := FQuery.SQL.Text + Format(PHRASE, [TOperatorType.LIKE.ToString, ' :' + LKeyParam]);
91+ LParam := FQuery.ParamByName(LKeyParam);
92+ LParam.DataType := ftString;
93+ if Pos(' %' , AValue) <= 0 then
94+ LParam.Value := AValue + ' %'
95+ else
96+ LParam.Value := AValue;
97+ end ;
98+
99+ procedure TDefaultCriteria.Where (const AField: string);
100+ const
101+ PHRASE = ' %s %s' ;
102+ begin
103+ FQuery.SQL.Add(Format(PHRASE, [TOperatorType.WHERE.ToString, AField]));
104+ end ;
105+
106+ procedure TDefaultCriteria.Order (const AField: string);
107+ const
108+ PHRASE = ' %s %s' ;
109+ begin
110+ FQuery.SQL.Add(Format(PHRASE, [TOperatorType.ORDER.ToString, AField]));
111+ end ;
112+
113+ constructor TManagerCriteria.Create(const AQuery: { $IFDEF UNIDAC} TUniQuery{ $ELSE} TFDQuery{ $ENDIF} );
114+ begin
115+ FCriteria := GetInstanceCriteria(AQuery);
116+ end ;
117+
118+ function TManagerCriteria.GetDrive (const AQuery: { $IFDEF UNIDAC} TUniQuery{ $ELSE} TFDQuery{ $ENDIF} ): string;
119+ { $IFDEF UNIDAC}
120+ begin
121+ Result := AQuery.Connection.ProviderName;
122+ end ;
123+ { $ELSE}
124+ var
125+ LDef: IFDStanConnectionDef;
126+ begin
127+ Result := AQuery.Connection.DriverName;
128+ if Result.IsEmpty and not AQuery.Connection.ConnectionDefName.IsEmpty then
129+ begin
130+ LDef := FDManager.ConnectionDefs.FindConnectionDef(AQuery.Connection.ConnectionDefName);
131+ if LDef = nil then
132+ raise Exception.Create(' ConnectionDefs "' + AQuery.Connection.ConnectionDefName + ' " not found' );
133+ Result := LDef.Params.DriverID;
134+ end ;
135+ end ;
136+ { $ENDIF}
137+
138+ function TManagerCriteria.GetInstanceCriteria (const AQuery: { $IFDEF UNIDAC} TUniQuery{ $ELSE} TFDQuery{ $ENDIF} ): ICriteria;
139+ begin
140+ case AnsiIndexStr(GetDrive(AQuery), [' PG' ]) of
141+ 0 :
142+ Result := TDefaultCriteria.Create(AQuery);
143+ else
144+ Result := TDefaultCriteria.Create(AQuery);
145+ end ;
146+ end ;
147+
148148end .
149-
149+
0 commit comments