added more meaningful error messages for BTree op boundary cases

git-svn-id: https://hyracks.googlecode.com/svn/trunk@181 123451ca-8445-de46-9d55-352943316053
diff --git a/hyracks/hyracks-examples/btree-example/btreehelper/src/main/java/edu/uci/ics/hyracks/examples/btree/helper/FileMappingProvider.java b/hyracks/hyracks-examples/btree-example/btreehelper/src/main/java/edu/uci/ics/hyracks/examples/btree/helper/FileMappingProvider.java
index c63be46..5a03045 100644
--- a/hyracks/hyracks-examples/btree-example/btreehelper/src/main/java/edu/uci/ics/hyracks/examples/btree/helper/FileMappingProvider.java
+++ b/hyracks/hyracks-examples/btree-example/btreehelper/src/main/java/edu/uci/ics/hyracks/examples/btree/helper/FileMappingProvider.java
@@ -33,4 +33,9 @@
 	public void unmapName(String name) {
 		map.remove(name);
 	}
+	
+	@Override
+	public Integer getFileId(String name) {
+		return map.get(name);
+	}
 }
diff --git a/hyracks/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeBulkLoadOperatorNodePushable.java b/hyracks/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeBulkLoadOperatorNodePushable.java
index c2d3a10..3c84796 100644
--- a/hyracks/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeBulkLoadOperatorNodePushable.java
+++ b/hyracks/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeBulkLoadOperatorNodePushable.java
@@ -43,16 +43,22 @@
         this.recordDescProvider = recordDescProvider;
         tuple.setFieldPermutation(fieldPermutation);
     }
-
+    
     @Override
-    public void close() throws HyracksDataException {
+    public void open() throws HyracksDataException {
+        AbstractBTreeOperatorDescriptor opDesc = btreeOpHelper.getOperatorDescriptor();
+        RecordDescriptor recDesc = recordDescProvider.getInputRecordDescriptor(opDesc.getOperatorId(), 0);        
+        accessor = new FrameTupleAccessor(btreeOpHelper.getHyracksContext(), recDesc);
+        IBTreeMetaDataFrame metaFrame = new MetaDataFrame();        
+        btreeOpHelper.init();
+        btreeOpHelper.getBTree().open(btreeOpHelper.getBTreeFileId());        
         try {
-            btreeOpHelper.getBTree().endBulkLoad(bulkLoadCtx);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
+			bulkLoadCtx = btreeOpHelper.getBTree().beginBulkLoad(fillFactor, btreeOpHelper.getLeafFrame(), btreeOpHelper.getInteriorFrame(), metaFrame);
+		} catch (Exception e) {
+			throw new HyracksDataException(e.getMessage());
+		}
     }
-
+    
     @Override
     public void nextFrame(ByteBuffer buffer) throws HyracksDataException {
         accessor.reset(buffer);
@@ -69,20 +75,14 @@
     }
     
     @Override
-    public void open() throws HyracksDataException {
-        AbstractBTreeOperatorDescriptor opDesc = btreeOpHelper.getOperatorDescriptor();
-        RecordDescriptor recDesc = recordDescProvider.getInputRecordDescriptor(opDesc.getOperatorId(), 0);        
-        accessor = new FrameTupleAccessor(btreeOpHelper.getHyracksContext(), recDesc);
-        IBTreeMetaDataFrame metaFrame = new MetaDataFrame();
+    public void close() throws HyracksDataException {
         try {
-            btreeOpHelper.init();
-            btreeOpHelper.getBTree().open(btreeOpHelper.getBTreeFileId());
-            bulkLoadCtx = btreeOpHelper.getBTree().beginBulkLoad(fillFactor, btreeOpHelper.getLeafFrame(), btreeOpHelper.getInteriorFrame(), metaFrame);
+            btreeOpHelper.getBTree().endBulkLoad(bulkLoadCtx);
         } catch (Exception e) {
             e.printStackTrace();
         }
     }
-
+    
     @Override
     public void flush() throws HyracksDataException {
     }
diff --git a/hyracks/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeDropOperatorNodePushable.java b/hyracks/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeDropOperatorNodePushable.java
index 6874f30..3bdf4a2 100644
--- a/hyracks/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeDropOperatorNodePushable.java
+++ b/hyracks/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeDropOperatorNodePushable.java
@@ -49,9 +49,13 @@
         
         File f = fileSplitProvider.getFileSplits()[partition].getLocalFile();        
         String fileName = f.getAbsolutePath();            
+                
+        Integer fileId = fileMappingProviderProvider.getFileMappingProvider().getFileId(fileName);
+        if(fileId == null) {
+        	throw new HyracksDataException("Cannot drop B-Tree with name " + fileName + ". No file mapping exists.");
+        }
+        int btreeFileId = fileId; 
         
-        int btreeFileId = fileMappingProviderProvider.getFileMappingProvider().mapNameToFileId(fileName, false);
-
         // unregister btree instance            
         btreeRegistry.lock();
         try {
@@ -59,16 +63,16 @@
         } finally {
             btreeRegistry.unlock();
         }
-
+        
+        // remove name to id mapping
+        fileMappingProviderProvider.getFileMappingProvider().unmapName(fileName);
+                
         // unregister file
         fileManager.unregisterFile(btreeFileId);
         
         if (f.exists()) {
             f.delete();
         }
-
-        // remove name to id mapping
-        fileMappingProviderProvider.getFileMappingProvider().unmapName(fileName);
     }
 
     @Override
diff --git a/hyracks/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeOpHelper.java b/hyracks/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeOpHelper.java
index e423487..277938d 100644
--- a/hyracks/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeOpHelper.java
+++ b/hyracks/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/BTreeOpHelper.java
@@ -15,10 +15,12 @@
 package edu.uci.ics.hyracks.storage.am.btree.dataflow;
 
 import java.io.File;
+import java.io.FileNotFoundException;
 import java.io.RandomAccessFile;
 
 import edu.uci.ics.hyracks.api.context.IHyracksContext;
 import edu.uci.ics.hyracks.api.dataflow.value.IBinaryComparator;
+import edu.uci.ics.hyracks.api.exceptions.HyracksDataException;
 import edu.uci.ics.hyracks.dataflow.std.file.IFileSplitProvider;
 import edu.uci.ics.hyracks.storage.am.btree.api.IBTreeInteriorFrame;
 import edu.uci.ics.hyracks.storage.am.btree.api.IBTreeLeafFrame;
@@ -49,32 +51,49 @@
         this.partition = partition;
     }  
     
-    void init() throws Exception {
+    void init() throws HyracksDataException {
     	
     	IBufferCache bufferCache = opDesc.getBufferCacheProvider().getBufferCache();
         FileManager fileManager = opDesc.getBufferCacheProvider().getFileManager();
         IFileMappingProviderProvider fileMappingProviderProvider = opDesc.getFileMappingProviderProvider();               
         IFileSplitProvider fileSplitProvider = opDesc.getFileSplitProvider();
         
-        //String ncDataPath = System.getProperty("NodeControllerDataPath");
         File f = fileSplitProvider.getFileSplits()[partition].getLocalFile();
         if(!f.exists()) {
         	File dir = new File(f.getParent());        	
         	dir.mkdirs();
         }
-        RandomAccessFile raf = new RandomAccessFile(f, "rw");
+        RandomAccessFile raf;
+		try {
+			raf = new RandomAccessFile(f, "rw");
+		} catch (FileNotFoundException e) {
+			throw new HyracksDataException(e.getMessage());
+		}
         
         String fileName = f.getAbsolutePath();
-        btreeFileId = fileMappingProviderProvider.getFileMappingProvider().mapNameToFileId(fileName, createBTree);     
+        Integer fileId = fileMappingProviderProvider.getFileMappingProvider().getFileId(fileName);        
+        if(fileId == null) {
+        	if(createBTree) {
+        		fileId = fileMappingProviderProvider.getFileMappingProvider().mapNameToFileId(fileName, createBTree);        		
+        	}
+        	else {
+        		throw new HyracksDataException("Cannot get id for file " + fileName + ". File name has not been mapped.");
+        	}
+        }
+        else {
+        	if(createBTree) {
+        		throw new HyracksDataException("Cannot map file " + fileName + " to an id. File name has already been mapped.");
+        	}        	     
+        }        
+        btreeFileId = fileId;  
         
         if (!f.exists() && !createBTree) {
-            throw new Exception("Trying to open btree from file " + fileName + " but file doesn't exist.");
+            throw new HyracksDataException("Trying to open btree from file " + fileName + " but file doesn't exist.");
         }
         
-        try {
-            FileInfo fi = new FileInfo(btreeFileId, raf);
-            fileManager.registerFile(fi);
-        } catch (Exception e) {
+        if(createBTree) {
+        	FileInfo fi = new FileInfo(btreeFileId, raf);
+        	fileManager.registerFile(fi);
         }
         
         interiorFrame = opDesc.getInteriorFactory().getFrame();
@@ -90,7 +109,7 @@
                 // check if btree has already been registered by another thread
                 btree = btreeRegistry.get(btreeFileId);
                 if (btree == null) {
-                    // this thread should create and register the btee
+                    // this thread should create and register the btree
                 	                   
                     IBinaryComparator[] comparators = new IBinaryComparator[opDesc.getComparatorFactories().length];
                     for (int i = 0; i < opDesc.getComparatorFactories().length; i++) {
@@ -102,7 +121,11 @@
                     btree = new BTree(bufferCache, opDesc.getInteriorFactory(), opDesc.getLeafFactory(), cmp);
                     if (createBTree) {
                         MetaDataFrame metaFrame = new MetaDataFrame();
-                        btree.create(btreeFileId, leafFrame, metaFrame);
+                        try {
+							btree.create(btreeFileId, leafFrame, metaFrame);
+						} catch (Exception e) {
+							throw new HyracksDataException(e.getMessage());
+						}
                     }
                     btree.open(btreeFileId);
                     btreeRegistry.register(btreeFileId, btree);
diff --git a/hyracks/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/ConstantTupleSourceOperatorNodePushable.java b/hyracks/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/ConstantTupleSourceOperatorNodePushable.java
index cbdb713..e02a37c 100644
--- a/hyracks/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/ConstantTupleSourceOperatorNodePushable.java
+++ b/hyracks/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/ConstantTupleSourceOperatorNodePushable.java
@@ -30,7 +30,8 @@
 		ByteBuffer writeBuffer = ctx.getResourceManager().allocateFrame();
 		FrameTupleAppender appender = new FrameTupleAppender(ctx);
 		appender.reset(writeBuffer, true);
-		appender.append(fieldSlots, tupleData, 0, tupleSize);		
+		if(fieldSlots != null && tupleData != null && tupleSize > 0)
+			appender.append(fieldSlots, tupleData, 0, tupleSize);
 		FrameUtils.flushFrame(writeBuffer, writer);
 		writer.close();
 	}
diff --git a/hyracks/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/FileMappingProvider.java b/hyracks/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/FileMappingProvider.java
index 995ed23..35eccc9 100644
--- a/hyracks/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/FileMappingProvider.java
+++ b/hyracks/hyracks-storage-am-btree/src/main/java/edu/uci/ics/hyracks/storage/am/btree/dataflow/FileMappingProvider.java
@@ -33,4 +33,9 @@
 	public void unmapName(String name) {
 		map.remove(name);
 	}
+
+	@Override
+	public Integer getFileId(String name) {
+		return map.get(name);
+	}
 }
diff --git a/hyracks/hyracks-storage-common/src/main/java/edu/uci/ics/hyracks/storage/common/file/FileManager.java b/hyracks/hyracks-storage-common/src/main/java/edu/uci/ics/hyracks/storage/common/file/FileManager.java
index abdf9d3..86e236d 100644
--- a/hyracks/hyracks-storage-common/src/main/java/edu/uci/ics/hyracks/storage/common/file/FileManager.java
+++ b/hyracks/hyracks-storage-common/src/main/java/edu/uci/ics/hyracks/storage/common/file/FileManager.java
@@ -29,7 +29,7 @@
 
     public void registerFile(FileInfo fInfo) throws HyracksDataException {
         if (fileRegistry.containsKey(fInfo.getFileId())) {
-            throw new HyracksDataException("File with id " + fInfo.getFileId() + " is already registered");
+            throw new HyracksDataException("File " + fInfo.getFile().toString() + " with id " + fInfo.getFileId() + " is already registered");
         }
         fileRegistry.put(fInfo.getFileId(), fInfo);
     }
diff --git a/hyracks/hyracks-storage-common/src/main/java/edu/uci/ics/hyracks/storage/common/file/IFileMappingProvider.java b/hyracks/hyracks-storage-common/src/main/java/edu/uci/ics/hyracks/storage/common/file/IFileMappingProvider.java
index 76f0ab8..6fb44a1 100644
--- a/hyracks/hyracks-storage-common/src/main/java/edu/uci/ics/hyracks/storage/common/file/IFileMappingProvider.java
+++ b/hyracks/hyracks-storage-common/src/main/java/edu/uci/ics/hyracks/storage/common/file/IFileMappingProvider.java
@@ -37,4 +37,14 @@
      * @return void
      */
     public void unmapName(String name);
+    
+    /**
+     * Get file id of an already mapped file
+     * 
+     * @param name
+     *            - Name of the file
+     * 
+     * @return The file id on a successful lookup, null if unsuccessful.
+     */
+    public Integer getFileId(String name);
 }
\ No newline at end of file