/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.phoenix.end2end;
 
import static org.apache.phoenix.util.TestUtil.TEST_PROPERTIES;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;

import org.apache.phoenix.util.PropertiesUtil;
import org.junit.Test;

public class EvaluationOfORIT extends BaseHBaseManagedTimeIT{
		
    @Test
    public void testFalseOrFalse() throws SQLException {
        Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES);
        Connection conn = DriverManager.getConnection(getUrl(), props);
        ResultSet rs = conn.createStatement().executeQuery("SELECT (FALSE OR FALSE) AS B FROM SYSTEM.CATALOG LIMIT 1");
        assertTrue(rs.next());
        assertFalse(rs.getBoolean(1));
        conn.close();
    }
    
	@Test
	public void testPKOrNotPKInOREvaluation() throws SQLException {
	    Properties props = PropertiesUtil.deepCopy(TEST_PROPERTIES);
	    Connection conn = DriverManager.getConnection(getUrl(), props);	    
	    conn.setAutoCommit(false);
	    
            String create = "CREATE TABLE DIE ( ID INTEGER NOT NULL PRIMARY KEY,NAME VARCHAR(50))";
            PreparedStatement createStmt = conn.prepareStatement(create);
            createStmt.execute();
            PreparedStatement stmt = conn.prepareStatement(
                    "upsert into " +
                    "DIE VALUES (?, ?)");

            stmt.setInt(1, 1);
            stmt.setString(2, "Tester1");
            stmt.execute();
            
            stmt.setInt(1,2);
            stmt.setString(2, "Tester2");
            stmt.execute();
            
            stmt.setInt(1,3);
            stmt.setString(2, "Tester3");
            stmt.execute();
            
            stmt.setInt(1,4);
            stmt.setString(2, "LikeTester1");
            stmt.execute();
            
            stmt.setInt(1,5);
            stmt.setString(2, "LikeTester2");
            stmt.execute();
            
            stmt.setInt(1,6);
            stmt.setString(2, "LikeTesterEnd");
            stmt.execute();
            
            stmt.setInt(1,7);
            stmt.setString(2, "LikeTesterEnd2");
            stmt.execute();
            
            stmt.setInt(1,8);
            stmt.setString(2, "Tester3");
            stmt.execute();
            
            stmt.setInt(1,9);
            stmt.setString(2, "Tester4");
            stmt.execute();
            
            stmt.setInt(1,10);
            stmt.setString(2, "Tester5");
            stmt.execute();
            
            stmt.setInt(1,11);
            stmt.setString(2, "Tester6");
            stmt.execute();
            
            stmt.setInt(1,12);
            stmt.setString(2, "tester6");
            stmt.execute();
            
            stmt.setInt(1,13);
            stmt.setString(2, "lester1");
            stmt.execute();
            
            stmt.setInt(1,14);
            stmt.setString(2, "le50ster1");
            stmt.execute();
            
            stmt.setInt(1,15);
            stmt.setString(2, "LE50ster1");
            stmt.execute();
            
            stmt.setInt(1,16);
            stmt.setString(2, "LiketesterEnd");
            stmt.execute();
            
            stmt.setInt(1,17);
            stmt.setString(2, "la50ster1");
            stmt.execute();
            
            stmt.setInt(1,18);
            stmt.setString(2, "lA50ster0");
            stmt.execute();
            
            stmt.setInt(1,19);
            stmt.setString(2, "lA50ster2");
            stmt.execute();
            
            stmt.setInt(1,20);
            stmt.setString(2, "la50ster0");
            stmt.execute();
            
            stmt.setInt(1,21);
            stmt.setString(2, "la50ster2");
            stmt.execute();
            
            stmt.setInt(1,22);
            stmt.setString(2, "La50ster3");
            stmt.execute();
            
            stmt.setInt(1,23);
            stmt.setString(2, "la50ster3");
            stmt.execute();
            
            stmt.setInt(1,24);
            stmt.setString(2, "l[50ster3");
            stmt.execute();
            
            stmt.setInt(1,25);
            stmt.setString(2, "Tester1");
            stmt.execute();
            
            stmt.setInt(1,26);
            stmt.setString(2, "Tester100");
            stmt.execute();		   
            conn.commit();
            
            String select = "Select * from DIE where ID=6 or Name between 'Tester1' and 'Tester3'";
            ResultSet rs;
            rs = conn.createStatement().executeQuery(select);
            assertTrue(rs.next());
            assertEquals(1,rs.getInt(1));
            assertTrue(rs.next());
            assertEquals(2,rs.getInt(1));
            assertTrue(rs.next());
            assertEquals(3,rs.getInt(1));
            assertTrue(rs.next());
            assertEquals(6,rs.getInt(1));
            assertTrue(rs.next());
            assertEquals(8,rs.getInt(1));
            assertTrue(rs.next());
            assertEquals(25,rs.getInt(1));
            assertTrue(rs.next());
            assertEquals(26,rs.getInt(1));		        
            conn.close();               
	}
    
	 
}
