@@ -2845,4 +2845,178 @@ function testHasAny() {
2845
2845
$ this ->Dbo ->hasAny ($ this ->Model , array ());
2846
2846
2847
2847
}
2848
- }
2848
+
2849
+
2850
+ /**
2851
+ * testStatements method
2852
+ *
2853
+ * @access public
2854
+ * @return void
2855
+ */
2856
+ function testStatements () {
2857
+ $ this ->skipIf (true , 'Fix me ' );
2858
+ $ this ->loadFixtures ('Article ' , 'User ' , 'Comment ' , 'Tag ' , 'Attachment ' , 'ArticlesTag ' );
2859
+ $ Article = new Article ();
2860
+ //$this->testDb = $this->getMock('DboMysql', array('connect', 'execute', '_execute'));
2861
+
2862
+ $ result = $ this ->testDb ->update ($ Article , array ('field1 ' ), array ('value1 ' ));
2863
+ $ this ->assertFalse ($ result );
2864
+ $ result = $ this ->testDb ->getLastQuery ();
2865
+ $ this ->assertPattern ('/^\s*UPDATE\s+ ' . $ this ->testDb ->fullTableName ('articles ' ) . '\s+SET\s+`field1`\s*=\s* \'value1 \'\s+WHERE\s+1 = 1\s*$/ ' , $ result );
2866
+
2867
+ $ result = $ this ->testDb ->update ($ Article , array ('field1 ' ), array ('2 ' ), '2=2 ' );
2868
+ $ this ->assertFalse ($ result );
2869
+ $ result = $ this ->testDb ->getLastQuery ();
2870
+ $ this ->assertPattern ('/^\s*UPDATE\s+ ' . $ this ->testDb ->fullTableName ('articles ' ) . ' AS `Article`\s+LEFT JOIN\s+ ' . $ this ->testDb ->fullTableName ('users ' ) . ' AS `User` ON \(`Article`.`user_id` = `User`.`id`\)\s+SET\s+`Article`\.`field1`\s*=\s*2\s+WHERE\s+2\s*=\s*2\s*$/ ' , $ result );
2871
+
2872
+ $ result = $ this ->testDb ->delete ($ Article );
2873
+ $ this ->assertTrue ($ result );
2874
+ $ result = $ this ->testDb ->getLastQuery ();
2875
+ $ this ->assertPattern ('/^\s*DELETE\s+FROM\s+ ' . $ this ->testDb ->fullTableName ('articles ' ) . '\s+WHERE\s+1 = 1\s*$/ ' , $ result );
2876
+
2877
+ $ result = $ this ->testDb ->delete ($ Article , true );
2878
+ $ this ->assertTrue ($ result );
2879
+ $ result = $ this ->testDb ->getLastQuery ();
2880
+ $ this ->assertPattern ('/^\s*DELETE\s+`Article`\s+FROM\s+ ' . $ this ->testDb ->fullTableName ('articles ' ) . '\s+AS `Article`\s+LEFT JOIN\s+ ' . $ this ->testDb ->fullTableName ('users ' ) . ' AS `User` ON \(`Article`.`user_id` = `User`.`id`\)\s+WHERE\s+1\s*=\s*1\s*$/ ' , $ result );
2881
+
2882
+ $ result = $ this ->testDb ->delete ($ Article , '2=2 ' );
2883
+ $ this ->assertTrue ($ result );
2884
+ $ result = $ this ->testDb ->getLastQuery ();
2885
+ $ this ->assertPattern ('/^\s*DELETE\s+`Article`\s+FROM\s+ ' . $ this ->testDb ->fullTableName ('articles ' ) . '\s+AS `Article`\s+LEFT JOIN\s+ ' . $ this ->testDb ->fullTableName ('users ' ) . ' AS `User` ON \(`Article`.`user_id` = `User`.`id`\)\s+WHERE\s+2\s*=\s*2\s*$/ ' , $ result );
2886
+
2887
+ $ result = $ this ->testDb ->hasAny ($ Article , '1=2 ' );
2888
+ $ this ->assertFalse ($ result );
2889
+
2890
+ $ result = $ this ->testDb ->insertMulti ('articles ' , array ('field ' ), array ('(1) ' , '(2) ' ));
2891
+ $ this ->assertNull ($ result );
2892
+ $ result = $ this ->testDb ->getLastQuery ();
2893
+ $ this ->assertPattern ('/^\s*INSERT INTO\s+ ' . $ this ->testDb ->fullTableName ('articles ' ) . '\s+\(`field`\)\s+VALUES\s+\(1\),\s*\(2\)\s*$/ ' , $ result );
2894
+ }
2895
+
2896
+ /**
2897
+ * test fields generating usable virtual fields to use in query
2898
+ *
2899
+ * @return void
2900
+ */
2901
+ function testVirtualFields () {
2902
+ $ this ->loadFixtures ('Article ' , 'Comment ' );
2903
+ $ this ->Dbo ->virtualFieldSeparator = '__ ' ;
2904
+ $ Article = ClassRegistry::init ('Article ' );
2905
+ $ Article ->virtualFields = array (
2906
+ 'this_moment ' => 'NOW() ' ,
2907
+ 'two ' => '1 + 1 ' ,
2908
+ 'comment_count ' => 'SELECT COUNT(*) FROM ' . $ this ->Dbo ->fullTableName ('comments ' ) .
2909
+ ' WHERE Article.id = ' . $ this ->Dbo ->fullTableName ('comments ' ) . '.article_id '
2910
+ );
2911
+ $ result = $ this ->Dbo ->fields ($ Article );
2912
+ $ expected = array (
2913
+ '`Article`.`id` ' ,
2914
+ '`Article`.`user_id` ' ,
2915
+ '`Article`.`title` ' ,
2916
+ '`Article`.`body` ' ,
2917
+ '`Article`.`published` ' ,
2918
+ '`Article`.`created` ' ,
2919
+ '`Article`.`updated` ' ,
2920
+ '(NOW()) AS `Article__this_moment` ' ,
2921
+ '(1 + 1) AS `Article__two` ' ,
2922
+ '(SELECT COUNT(*) FROM comments WHERE `Article`.`id` = `comments`.`article_id`) AS `Article__comment_count` '
2923
+ );
2924
+ $ this ->assertEqual ($ expected , $ result );
2925
+
2926
+ $ result = $ this ->Dbo ->fields ($ Article , null , array ('this_moment ' , 'title ' ));
2927
+ $ expected = array (
2928
+ '`Article`.`title` ' ,
2929
+ '(NOW()) AS `Article__this_moment` ' ,
2930
+ );
2931
+ $ this ->assertEqual ($ expected , $ result );
2932
+
2933
+ $ result = $ this ->Dbo ->fields ($ Article , null , array ('Article.title ' , 'Article.this_moment ' ));
2934
+ $ expected = array (
2935
+ '`Article`.`title` ' ,
2936
+ '(NOW()) AS `Article__this_moment` ' ,
2937
+ );
2938
+ $ this ->assertEqual ($ expected , $ result );
2939
+
2940
+ $ result = $ this ->Dbo ->fields ($ Article , null , array ('Article.this_moment ' , 'Article.title ' ));
2941
+ $ expected = array (
2942
+ '`Article`.`title` ' ,
2943
+ '(NOW()) AS `Article__this_moment` ' ,
2944
+ );
2945
+ $ this ->assertEqual ($ expected , $ result );
2946
+
2947
+ $ result = $ this ->Dbo ->fields ($ Article , null , array ('Article.* ' ));
2948
+ $ expected = array (
2949
+ '`Article`.* ' ,
2950
+ '(NOW()) AS `Article__this_moment` ' ,
2951
+ '(1 + 1) AS `Article__two` ' ,
2952
+ '(SELECT COUNT(*) FROM comments WHERE `Article`.`id` = `comments`.`article_id`) AS `Article__comment_count` '
2953
+ );
2954
+ $ this ->assertEqual ($ expected , $ result );
2955
+
2956
+ $ result = $ this ->Dbo ->fields ($ Article , null , array ('* ' ));
2957
+ $ expected = array (
2958
+ '* ' ,
2959
+ '(NOW()) AS `Article__this_moment` ' ,
2960
+ '(1 + 1) AS `Article__two` ' ,
2961
+ '(SELECT COUNT(*) FROM comments WHERE `Article`.`id` = `comments`.`article_id`) AS `Article__comment_count` '
2962
+ );
2963
+ $ this ->assertEqual ($ expected , $ result );
2964
+ }
2965
+
2966
+ /**
2967
+ * test conditions to generate query conditions for virtual fields
2968
+ *
2969
+ * @return void
2970
+ */
2971
+ function testVirtualFieldsInConditions () {
2972
+ $ Article = ClassRegistry::init ('Article ' );
2973
+ $ Article ->virtualFields = array (
2974
+ 'this_moment ' => 'NOW() ' ,
2975
+ 'two ' => '1 + 1 ' ,
2976
+ 'comment_count ' => 'SELECT COUNT(*) FROM ' . $ this ->Dbo ->fullTableName ('comments ' ) .
2977
+ ' WHERE Article.id = ' . $ this ->Dbo ->fullTableName ('comments ' ) . '.article_id '
2978
+ );
2979
+ $ conditions = array ('two ' => 2 );
2980
+ $ result = $ this ->Dbo ->conditions ($ conditions , true , false , $ Article );
2981
+ $ expected = '(1 + 1) = 2 ' ;
2982
+ $ this ->assertEqual ($ expected , $ result );
2983
+
2984
+ $ conditions = array ('this_moment BETWEEN ? AND ? ' => array (1 ,2 ));
2985
+ $ expected = 'NOW() BETWEEN 1 AND 2 ' ;
2986
+ $ result = $ this ->Dbo ->conditions ($ conditions , true , false , $ Article );
2987
+ $ this ->assertEqual ($ expected , $ result );
2988
+
2989
+ $ conditions = array ('comment_count > ' => 5 );
2990
+ $ expected = '(SELECT COUNT(*) FROM comments WHERE `Article`.`id` = `comments`.`article_id`) > 5 ' ;
2991
+ $ result = $ this ->Dbo ->conditions ($ conditions , true , false , $ Article );
2992
+ $ this ->assertEqual ($ expected , $ result );
2993
+
2994
+ $ conditions = array ('NOT ' => array ('two ' => 2 ));
2995
+ $ result = $ this ->Dbo ->conditions ($ conditions , true , false , $ Article );
2996
+ $ expected = 'NOT ((1 + 1) = 2) ' ;
2997
+ $ this ->assertEqual ($ expected , $ result );
2998
+ }
2999
+
3000
+ /**
3001
+ * test that virtualFields with complex functions and aliases work.
3002
+ *
3003
+ * @return void
3004
+ */
3005
+ function testConditionsWithComplexVirtualFields () {
3006
+ $ Article = ClassRegistry::init ('Article ' );
3007
+ $ Article ->virtualFields = array (
3008
+ 'distance ' => 'ACOS(SIN(20 * PI() / 180)
3009
+ * SIN(Article.latitude * PI() / 180)
3010
+ + COS(20 * PI() / 180)
3011
+ * COS(Article.latitude * PI() / 180)
3012
+ * COS((50 - Article.longitude) * PI() / 180)
3013
+ ) * 180 / PI() * 60 * 1.1515 * 1.609344 '
3014
+ );
3015
+ $ conditions = array ('distance >= ' => 20 );
3016
+ $ result = $ this ->Dbo ->conditions ($ conditions , true , true , $ Article );
3017
+
3018
+ $ this ->assertPattern ('/\) >= 20/ ' , $ result );
3019
+ $ this ->assertPattern ('/[` \'"]Article[` \'"].[` \'"]latitude[` \'"]/ ' , $ result );
3020
+ $ this ->assertPattern ('/[` \'"]Article[` \'"].[` \'"]longitude[` \'"]/ ' , $ result );
3021
+ }
3022
+ }
0 commit comments