Changeset: c3bce7e7ea37 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c3bce7e7ea37
Modified Files:
        sql/src/test/sciql/Tests/Msciql00.mal
        sql/src/test/sciql/Tests/Msciql01.mal
        sql/src/test/sciql/Tests/Msciql02.mal
        sql/src/test/sciql/Tests/Msciql03.mal
        sql/src/test/sciql/Tests/Msciql04.mal
        sql/src/test/sciql/Tests/Msciql05.mal
        sql/src/test/sciql/Tests/Msciql06.mal
        sql/src/test/sciql/Tests/Msciql07.mal
        sql/src/test/sciql/Tests/Msciql08.mal
        sql/src/test/sciql/Tests/Msciql09.mal
        sql/src/test/sciql/Tests/Msciql10.mal
        sql/src/test/sciql/Tests/Msciql12.mal
        sql/src/test/sciql/Tests/Msciql13.mal
        sql/src/test/sciql/Tests/Msciql14.mal
        sql/src/test/sciql/Tests/Msciql15.mal
        sql/src/test/sciql/Tests/Msciql16.mal
        sql/src/test/sciql/Tests/Msciql17.mal
        sql/src/test/sciql/Tests/Msciql18.mal
        sql/src/test/sciql/Tests/Msciql19.mal
        sql/src/test/sciql/Tests/Msciql20.mal
        sql/src/test/sciql/Tests/Msciql21.mal
        sql/src/test/sciql/Tests/Msciql22.mal
        sql/src/test/sciql/Tests/Msciql23.mal
        sql/src/test/sciql/Tests/Msciql24.mal
        sql/src/test/sciql/Tests/Msciql25.mal
        sql/src/test/sciql/Tests/Msciql26.mal
        sql/src/test/sciql/Tests/Msciql27.mal
        sql/src/test/sciql/Tests/Msciql28.mal
        sql/src/test/sciql/Tests/Msciql29.mal
        sql/src/test/sciql/Tests/Msciql30.mal
        sql/src/test/sciql/Tests/Msciql31.mal
Branch: sciql
Log Message:

MAL versions of sciql queries


diffs (truncated from 325 to 300 lines):

diff -r 163a4aedba1f -r c3bce7e7ea37 sql/src/test/sciql/Tests/Msciql00.mal
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sql/src/test/sciql/Tests/Msciql00.mal     Fri Jan 14 14:46:02 2011 +0100
@@ -0,0 +1,7 @@
+--CREATE ARRAY A1( x integer DIMENSION[4], val float DEFAULT 0.0);
+CREATE table A1( x integer, val float DEFAULT 0.0);
+--CREATE ARRAY A2 ( x integer DIMENSION[0:4:1], val float DEFAULT 0.0);
+CREATE TABLE A2 ( x integer,  val float DEFAULT 0.0);
+CREATE SEQUENCE range AS integer START WITH 0 INCREMENT BY 1 MAXVALUE 3;
+--CREATE ARRAY A3 ( x integer DIMENSION range, val float DEFAULT 0.0);
+CREATE ARRAY A3 ( x integer , val float DEFAULT 0.0);
diff -r 163a4aedba1f -r c3bce7e7ea37 sql/src/test/sciql/Tests/Msciql01.mal
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sql/src/test/sciql/Tests/Msciql01.mal     Fri Jan 14 14:46:02 2011 +0100
@@ -0,0 +1,8 @@
+--CREATE ARRAY matrix ( x integer DIMENSION[4], y integer DIMENSION[4], val 
float DEFAULT 0.0 );
+CREATE TABLE matrix ( x integer,  y integer,  val float DEFAULT 0.0 );
+--CREATE ARRAY grid( x integer DIMENSION[4] CHECK(mod(x,2) = 0), y integer 
DIMENSION[4], val float DEFAULT 0.0);
+CREATE TABLE grid( x integer,  y integer , val float DEFAULT 0.0);
+--CREATE ARRAY diagonal( x integer DIMENSION[4], y integer DIMENSION[4] 
CHECK(x = y), val float );
+CREATE TABLE diagonal( x integer,  y integer, val float );
+--CREATE ARRAY sparse( x integer DIMENSION[4], y integer DIMENSION[4], val 
float DEFAULT 0.0 CHECK(val>0));
+CREATE TABLE sparse( x integer, y integer,  val float DEFAULT 0.0 
CHECK(val>0));
diff -r 163a4aedba1f -r c3bce7e7ea37 sql/src/test/sciql/Tests/Msciql02.mal
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sql/src/test/sciql/Tests/Msciql02.mal     Fri Jan 14 14:46:02 2011 +0100
@@ -0,0 +1,6 @@
+--CREATE TABLE experiment( 
+--     run date DIMENSION[  TIMESTAMP '2010-01-01':*: INTERVAL'1' day], 
+--     payload float ARRAY[4][4] DEFAULT 0.0 );
+CREATE TABLE experiment( 
+       run date,
+       payload float DEFAULT 0.0 );
diff -r 163a4aedba1f -r c3bce7e7ea37 sql/src/test/sciql/Tests/Msciql03.mal
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sql/src/test/sciql/Tests/Msciql03.mal     Fri Jan 14 14:46:02 2011 +0100
@@ -0,0 +1,53 @@
+# CREATE ARRAY stripes( x int dimension[4], y int dimension[4], val float 
DEFAULT 0.0);
+#create table stripes (x int, y int, val float);
+#insert into stripes values(0,0,0.0), (0,1,1.0), (1,0,2.0), (1,1,3.0);
+
+# base arrays are initialized once in most situations considered! (appends are 
allowed)
+
+#UPDATE stripes SET val = x + y; 
+# What is the storage model ? explicit dimensions? or implicit?
+
+# explicit model, after definition we have to instanciate the array
+       # create the x- and y- bats, initialize with their value
+       #pattern array.newIndex(min:any_0,max:any_0,step:any_0):bat[:oid,:any_0]
+       #pattern 
array.newIndex(xmin:any_0,xmax:any_0,xstep:any_0,ymin:any_1,ymax:any_1,ystep:any_1)(x:bat[:oid,:any_0],y:bat[:oid,:any_1])
+       #idem z, t
+       #pattern array.setDefault(idx:bat[:oid,:any_0], 
def:any_1):bat[:oid,:any_1];
+
+       # for a fixed array the post dimension operations are to be called 
explicitly
+       #(x,y):= array.newIndex(0,4,1,0,4,1);
+    #val  := array.setDefault(x,0.0);
+       # create the val bat
+
+function user.s1_1{autoCommit=true}():void;
+    _2 := sql.mvc();
+#if we have a dimension with fixed bounds then there can not be updates
+   (_3:bat[:oid,:int],_23:bat[:oid,:int])  := 
array.dimension(_2,"sys","stripes","x",0,4,1,"y",0,4,1);
+   _4:bat[:int,:oid]  := bat.reverse(_3);
+   _5:bat[:oid,:oid]  := bat.mirror(_4);
+   _32:bat[:oid,:int]  := batcalc.+(_3,_23);
+    _33 := batcalc.dbl(_32);
+    _34 := algebra.join(_5,_33);
+    _37:= aggr.count(_34);
+    sql.update(_2,"sys","stripes","val",_34);
+    sql.affectedRows(_37,"");
+end s1_1;
+
+#-- for stripes2 it becomes
+function user.s1_1{autoCommit=true}():void;
+    _2 := sql.mvc();
+#if we have a dimension with free bounds then we need an explicit 
representation of x
+   (_3:bat[:oid,:int],_23:bat[:oid,:int])  := 
array.dimension(_2,"sys","stripes","x",null,null,null,"y",null,null,null);
+   _4:bat[:int,:oid]  := bat.reverse(_3);
+   _5:bat[:oid,:oid]  := bat.mirror(_4);
+   _32:bat[:oid,:int]  := batcalc.+(_3,_23);
+    _33 := batcalc.dbl(_32);
+    _34 := algebra.join(_5,_33);
+    _37:= aggr.count(_34);
+    sql.update(_2,"sys","stripes","val",_34);
+    sql.affectedRows(_37,"");
+end s1_1; 
+
+#UPDATE grid
+#SET val = CASE WHEN x > y THEN x + y  WHEN X<y THEN x - y ELSE 0 END;
+#UPDATE diagonal SET val = x +y; UPDATE sparse SET val = mod(rand(),16);
diff -r 163a4aedba1f -r c3bce7e7ea37 sql/src/test/sciql/Tests/Msciql04.mal
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sql/src/test/sciql/Tests/Msciql04.mal     Fri Jan 14 14:46:02 2011 +0100
@@ -0,0 +1,1 @@
+INSERT INTO grid VALUES(1,1,25);
diff -r 163a4aedba1f -r c3bce7e7ea37 sql/src/test/sciql/Tests/Msciql05.mal
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sql/src/test/sciql/Tests/Msciql05.mal     Fri Jan 14 14:46:02 2011 +0100
@@ -0,0 +1,1 @@
+UPDATE experiment SET payload= NULL WHERE payload[x][y].val < 0;
diff -r 163a4aedba1f -r c3bce7e7ea37 sql/src/test/sciql/Tests/Msciql06.mal
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sql/src/test/sciql/Tests/Msciql06.mal     Fri Jan 14 14:46:02 2011 +0100
@@ -0,0 +1,26 @@
+#SELECT ARRAY (1,2,3,4); 
+#SELECT ARRAY((1,2),(3,4)); 
+#SELECT x, y, val FROM matrix WHERE val >2; 
+
+#SELECT x, y, val FROM stripes WHERE val >2; 
+function user.s0_0{autoCommit=true}():void;
+    _2 := sql.mvc();
+    _9:bat[:oid,:dbl]  := sql.bind(_2,"sys","stripes","val",0);
+    _10 := algebra.thetauselect(_9,2:dbl,">");
+    _12 := algebra.markT(_10,0@0:oid);
+    _13 := bat.reverse(_12);
+    _5:bat[:oid,:int]  := array.dimension(_2,"sys","stripes","x",0,0,4,1);
+    _14 := algebra.leftjoin(_13,_5);
+    _18 := algebra.leftjoin(_13,_9);
+    _16:bat[:oid,:int]  := array.dimension(_2,"sys","stripes","y",0,0,4,1);
+    _17 := algebra.leftjoin(_13,_16);
+    _19 := sql.resultSet(3,1,_14);
+    sql.rsColumn(_19,"sys.stripes","x","int",32,0,_14);
+    sql.rsColumn(_19,"sys.stripes","y","int",32,0,_17);
+    sql.rsColumn(_19,"sys.stripes","val":str,"double",53,0,_18);
+    _33 := io.stdout();
+    sql.exportResult(_33,_19);
+end s0_0;
+
+#SELECT [x], [y], val FROM matrix WHERE val >2; 
+#SELECT [T.k], [y], val FROM matrix JOIN T ON matrix.x = T.i;
diff -r 163a4aedba1f -r c3bce7e7ea37 sql/src/test/sciql/Tests/Msciql07.mal
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sql/src/test/sciql/Tests/Msciql07.mal     Fri Jan 14 14:46:02 2011 +0100
@@ -0,0 +1,5 @@
+-- postgresql arrays
+
+create table pga(
+  v1 integer array[4],
+  v3 integer array[2][2]);
diff -r 163a4aedba1f -r c3bce7e7ea37 sql/src/test/sciql/Tests/Msciql08.mal
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sql/src/test/sciql/Tests/Msciql08.mal     Fri Jan 14 14:46:02 2011 +0100
@@ -0,0 +1,2 @@
+SELECT matrix[1][1].v; 
+SELECT sparse[0:2][0:2].v;
diff -r 163a4aedba1f -r c3bce7e7ea37 sql/src/test/sciql/Tests/Msciql09.mal
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sql/src/test/sciql/Tests/Msciql09.mal     Fri Jan 14 14:46:02 2011 +0100
@@ -0,0 +1,5 @@
+SET vector[0:2].v = (expr1,expr2); 
+SET vector[x].val = CASE  WHEN vector[x].val < 0  THEN 0 
+       WHEN vector[x].val >10 THEN 10 * x END ;
+
+       
diff -r 163a4aedba1f -r c3bce7e7ea37 sql/src/test/sciql/Tests/Msciql10.mal
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sql/src/test/sciql/Tests/Msciql10.mal     Fri Jan 14 14:46:02 2011 +0100
@@ -0,0 +1,6 @@
+CREATE ARRAY vmatrix (
+    x integer DIMENSION[-1:5],
+    y integer DIMENSION[-1:5],
+    w float DEFAULT 0);
+INSERT INTO vmatrix SELECT [i], [j], val  FROM matrix;
+INSERT INTO vmatrix SELECT [j], [i], val  FROM matrix;
diff -r 163a4aedba1f -r c3bce7e7ea37 sql/src/test/sciql/Tests/Msciql12.mal
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sql/src/test/sciql/Tests/Msciql12.mal     Fri Jan 14 14:46:02 2011 +0100
@@ -0,0 +1,3 @@
+SELECT [x], [y], avg(v) FROM matrix GROUP BY matrix[x:x+2][y:y+2];
+SELECT [x], [y], avg(v) FROM matrix GROUP BY DISTINCT matrix[x:x+2][y:y+2];
+SELECT [x], [y], avg(v) FROM vmatrix GROUP BY matrix[x-1:x+1][y-1:y+1];
diff -r 163a4aedba1f -r c3bce7e7ea37 sql/src/test/sciql/Tests/Msciql13.mal
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sql/src/test/sciql/Tests/Msciql13.mal     Fri Jan 14 14:46:02 2011 +0100
@@ -0,0 +1,1 @@
+SELECT [x],sum(val) FROM matrix GROUP BY DISTINCT matrix[x][y: *];
diff -r 163a4aedba1f -r c3bce7e7ea37 sql/src/test/sciql/Tests/Msciql14.mal
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sql/src/test/sciql/Tests/Msciql14.mal     Fri Jan 14 14:46:02 2011 +0100
@@ -0,0 +1,3 @@
+SELECT x, y, (matrix[x-1][y].v + matrix[x+1][y].v + matrix[x][y-1].v + 
matrix[x][y+1].v + matrix[x][y].v)/5
+FROM matrix[0:5][0:5] 
+GROUP BY matrix[x][y], matrix[x-1][y], matrix[x+1][y], matrix[x][y-1], 
matrix[x][y+1];
diff -r 163a4aedba1f -r c3bce7e7ea37 sql/src/test/sciql/Tests/Msciql15.mal
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sql/src/test/sciql/Tests/Msciql15.mal     Fri Jan 14 14:46:02 2011 +0100
@@ -0,0 +1,2 @@
+-- SELECT distance(A, ?V), A.* FROM matrix AS A GROUP BY matrix[x][*] AS A;
+SELECT distance(A, A), A.* FROM matrix AS A GROUP BY matrix[x][*];
diff -r 163a4aedba1f -r c3bce7e7ea37 sql/src/test/sciql/Tests/Msciql16.mal
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sql/src/test/sciql/Tests/Msciql16.mal     Fri Jan 14 14:46:02 2011 +0100
@@ -0,0 +1,1 @@
+ALTER ARRAY img ALTER x DIMENSION[-5:*];
diff -r 163a4aedba1f -r c3bce7e7ea37 sql/src/test/sciql/Tests/Msciql17.mal
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sql/src/test/sciql/Tests/Msciql17.mal     Fri Jan 14 14:46:02 2011 +0100
@@ -0,0 +1,5 @@
+ALTER ARRAY matrix ADD r float DEFAULT sqrt( power(x,2) + power(y,2));
+ALTER ARRAY matrix ADD theta float 
+       DEFAULT (CASE WHEN x=0 AND y=0 THEN 0
+       WHEN x> 0 THEN arcsin( CAST( x AS float) / r) 
+       WHEN  x< 0 THEN -arcsin( CAST( x AS float) / r) + PI() END);
diff -r 163a4aedba1f -r c3bce7e7ea37 sql/src/test/sciql/Tests/Msciql18.mal
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sql/src/test/sciql/Tests/Msciql18.mal     Fri Jan 14 14:46:02 2011 +0100
@@ -0,0 +1,4 @@
+CREATE ARRAY tmp(x integer DIMENSION, y integer DIMENSION, val float);
+INSERT INTO tmp SELECT x, y, avg(v) 
+FROM matrix 
+GROUP BY DISTINCT matrix[x:x+2][y:y+2];
diff -r 163a4aedba1f -r c3bce7e7ea37 sql/src/test/sciql/Tests/Msciql19.mal
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sql/src/test/sciql/Tests/Msciql19.mal     Fri Jan 14 14:46:02 2011 +0100
@@ -0,0 +1,18 @@
+CREATE SEQUENCE rng AS integer START WITH 0 INCREMENT BY 1 MAXVALUE 7;
+
+CREATE ARRAY white (
+   i integer DIMENSION[rng],
+   j integer DIMENSION[rng],
+   color char(5) DEFAULT 'white'
+);
+CREATE ARRAY black (LIKE white);
+CREATE ARRAY chessboard(
+   i integer DIMENSION[rng],
+   j integer DIMENSION[rng],
+   white char(5));
+INSERT INTO chessboard
+SELECT [i], [j], color FROM white
+   WHERE ( i * 8 + j) / 2 = 0
+UNION
+SELECT [i], [j], color FROM black
+   WHERE ( i * 8 + j) / 2 ;
diff -r 163a4aedba1f -r c3bce7e7ea37 sql/src/test/sciql/Tests/Msciql20.mal
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sql/src/test/sciql/Tests/Msciql20.mal     Fri Jan 14 14:46:02 2011 +0100
@@ -0,0 +1,7 @@
+CREATE SEQUENCE seq AS integer START WITH 0 INCREMENT BY 1 MAXVALUE 10;
+CREATE FUNCTION random(n integer) 
+RETURNS ARRAY( i integer DIMENSION[seq], val float)
+       RETURN SELECT seq, rand() FROM SEQUENCES seq;
+CREATE FUNCTION transpose ( a ARRAY( i integer DIMENSION, j integer DIMENSION, 
v float))
+RETURNS ARRAY( i integer DIMENSION, j integer DIMENSION, v float) 
+BEGIN  RETURN SELECT [i],[j], a[j][i].v FROM a; END;
diff -r 163a4aedba1f -r c3bce7e7ea37 sql/src/test/sciql/Tests/Msciql21.mal
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sql/src/test/sciql/Tests/Msciql21.mal     Fri Jan 14 14:46:02 2011 +0100
@@ -0,0 +1,3 @@
+CREATE FUNCTION markov( a ARRAY( x int DIMENSION, y int DIMENSION, f float), 
steps integer)
+RETURNS ARRAY( x int DIMENSION, y int DIMENSION, f float) 
+EXTERNAL NAME ’markov.loop’;
diff -r 163a4aedba1f -r c3bce7e7ea37 sql/src/test/sciql/Tests/Msciql22.mal
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sql/src/test/sciql/Tests/Msciql22.mal     Fri Jan 14 14:46:02 2011 +0100
@@ -0,0 +1,2 @@
+CREATE ARRAY landsat ( channel integer DIMENSION[7], x integer 
DIMENSION[1024], y integer DIMENSION[1024], v integer);
+UPDATE landsat SET v = noise(v,delta) WHERE channel = 6 and mod(x,6) = 1;
diff -r 163a4aedba1f -r c3bce7e7ea37 sql/src/test/sciql/Tests/Msciql23.mal
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sql/src/test/sciql/Tests/Msciql23.mal     Fri Jan 14 14:46:02 2011 +0100
@@ -0,0 +1,11 @@
+CREATE FUNCTION intens2radiance(b int, lmin real, lmax real) RETURNS real 
RETURN (lmax-lmin) * b /255.0 + lmin;
+
+CREATE ARRAY ndvi ( x int DIMENSION[1024], y int DIMENSION[1024], b1 real, b2 
real, v real);
+UPDATE ndvi 
+       SET b1 = (SELECT intens2radiance(v, lmin, lmax)
+               FROM landsat WHERE channel = 1
+               AND landsat.x = ndvi.x AND landsat.y = ndvi.y), 
+       b2 = (SELECT intens2radiance(v, lmin, lmax)
+               FROM landsat WHERE channel =2
+               AND landsat.x = ndvi.x AND      landsat.y = ndvi.y), 
+       v=(b2-b1)/(b2+b1);
diff -r 163a4aedba1f -r c3bce7e7ea37 sql/src/test/sciql/Tests/Msciql24.mal
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sql/src/test/sciql/Tests/Msciql24.mal     Fri Jan 14 14:46:02 2011 +0100
@@ -0,0 +1,1 @@
+SELECT [x], [y], avg(v) FROM vmatrix GROUP BY vmatrix[x-1:x+1][y-1:y+1] HAVING 
avg(v) BETWEEN 10 AND 100;
diff -r 163a4aedba1f -r c3bce7e7ea37 sql/src/test/sciql/Tests/Msciql25.mal
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sql/src/test/sciql/Tests/Msciql25.mal     Fri Jan 14 14:46:02 2011 +0100
@@ -0,0 +1,2 @@
+UPDATE img SET v = (SELECT d.v + e.v * power(-1,x) FROM d, e
+WHERE img.y = d.y and img.y = e.y AND d.x = img.x/2 AND e.x = img.x/2);
diff -r 163a4aedba1f -r c3bce7e7ea37 sql/src/test/sciql/Tests/Msciql26.mal
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sql/src/test/sciql/Tests/Msciql26.mal     Fri Jan 14 14:46:02 2011 +0100
@@ -0,0 +1,3 @@
+UPDATE img SET v = (SELECT d.v + e.v * power(-1,x) 
+FROM d, e
+WHERE img.y = d.y and img.y = e.y AND d.x = img.x/2 AND e.x = img.x/2);
diff -r 163a4aedba1f -r c3bce7e7ea37 sql/src/test/sciql/Tests/Msciql27.mal
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sql/src/test/sciql/Tests/Msciql27.mal     Fri Jan 14 14:46:02 2011 +0100
@@ -0,0 +1,3 @@
+CREATE ARRAY m ( x int DIMENSION[1024], v int );
+UPDATE m 
+       SET v = (SELECT sum(a.v * b.v) FROM a,b WHERE m.x = a.x and a.y = b.k);
diff -r 163a4aedba1f -r c3bce7e7ea37 sql/src/test/sciql/Tests/Msciql28.mal
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/sql/src/test/sciql/Tests/Msciql28.mal     Fri Jan 14 14:46:02 2011 +0100
_______________________________________________
Checkin-list mailing list
Checkin-list@monetdb.org
http://mail.monetdb.org/mailman/listinfo/checkin-list

Reply via email to