changeset 734:35bfc91b67d3

Added initial search functions and tests.
author mas01mj
date Wed, 15 Sep 2010 11:59:47 +0000
parents 4c89dccdd4a9
children c625f52cf9b4
files bindings/as3/build/as3bridge.swf bindings/as3/src/org/omras2/audiodb/Querier.as bindings/as3/src/org/omras2/audiodb/SearchEvent.as bindings/as3/src/org/omras2/audiodb/model/SearchResult.as bindings/as3/src/tests/AllTests.as bindings/as3/src/tests/TestQuerier.as
diffstat 6 files changed, 191 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
Binary file bindings/as3/build/as3bridge.swf has changed
--- a/bindings/as3/src/org/omras2/audiodb/Querier.as	Wed Sep 15 11:05:12 2010 +0000
+++ b/bindings/as3/src/org/omras2/audiodb/Querier.as	Wed Sep 15 11:59:47 2010 +0000
@@ -2,6 +2,7 @@
 {
 	import com.adobe.serialization.json.JSON;
 
+	import org.omras2.audiodb.model.SearchResult;
 	import org.omras2.audiodb.model.Track;
 
 	import flash.events.ErrorEvent;
@@ -27,6 +28,10 @@
 			this._trackCache = new Dictionary();
 		}
 
+		/**
+		 * Metadata handling
+		 */
+
 		public function lookup(uid : String) : void
 		{
 			if(_trackCache[uid])
@@ -50,22 +55,15 @@
 					this.dispatchEvent(err);
 				}
 				
-				loader.addEventListener(IOErrorEvent.IO_ERROR, this.handleLoadError);
-				loader.addEventListener(Event.COMPLETE, this.handleLoadComplete);
+				loader.addEventListener(IOErrorEvent.IO_ERROR, this.handleQueryError);
+				loader.addEventListener(Event.COMPLETE, this.handleLookupComplete);
 			}
 		}
 
-		private function handleLoadComplete(event : Event) : void 
+		private function handleLookupComplete(event : Event) : void 
 		{
-			var data : String = (event.target as URLLoader).data as String;
-			var response : Object = (JSON.decode(data) as Object);
-			if(response['status'] != 'ok')
-			{
-				var err : ErrorEvent = new ErrorEvent(ErrorEvent.ERROR);
-				err.text = response['message'];
-				this.dispatchEvent(err);
-			}
-			else
+			var response : Object = getResponse(event);
+			if(validResponse(response))
 			{
 				var track : Track = Track.createFromResponse(response['data']);
 				_trackCache[track.uid] = track;
@@ -73,7 +71,69 @@
 			}
 		}
 
-		private function handleLoadError(event : IOErrorEvent) : void 
+		/**
+		 * Search handling
+		 */
+
+		public function search(uid : String) : void
+		{
+			var url : String = _endpoint + "/search/" + uid;
+			var req : URLRequest = new URLRequest(url);
+			var loader : URLLoader = new URLLoader();
+				
+			try
+			{
+				loader.load(req);	
+			}
+			catch(error : SecurityError)
+			{
+				var err : ErrorEvent = new ErrorEvent(ErrorEvent.ERROR);
+				err.text = error.message;
+				this.dispatchEvent(err);
+			}
+				
+			loader.addEventListener(IOErrorEvent.IO_ERROR, this.handleQueryError);
+			loader.addEventListener(Event.COMPLETE, this.handleSearchComplete);
+		}
+
+		private function handleSearchComplete(event : Event) : void 
+		{
+			var response : Object = getResponse(event);
+			if(validResponse(response))
+			{
+				var results : Array = [];
+				for each(var result : Array in response['data'])
+				{
+					results.push(SearchResult.createFromResponse(result));
+				}
+				this.dispatchEvent(new SearchEvent(LookupEvent.COMPLETE, results));
+			}
+		}
+
+		/**
+		 * Reusable parsing / error functions
+		 */
+
+		private function getResponse(event : Event) : Object 
+		{
+			var data : String = (event.target as URLLoader).data as String;
+			var response : Object = (JSON.decode(data) as Object);
+			return response;
+		}
+
+		private function validResponse(response : Object) : Boolean 
+		{
+			if(response['status'] != 'ok')
+			{
+				var err : ErrorEvent = new ErrorEvent(ErrorEvent.ERROR);
+				err.text = response['message'];
+				this.dispatchEvent(err);
+				return false;
+			}
+			return true;
+		}
+
+		private function handleQueryError(event : IOErrorEvent) : void 
 		{
 			this.dispatchEvent(event);
 		}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bindings/as3/src/org/omras2/audiodb/SearchEvent.as	Wed Sep 15 11:59:47 2010 +0000
@@ -0,0 +1,30 @@
+package org.omras2.audiodb 
+{
+	import flash.events.Event;
+	
+	/**
+	 * @author mikej
+	 */
+	public class SearchEvent extends Event 
+	{
+		public static const COMPLETE : String = "complete";
+		private var _results : Array;
+		
+		public function SearchEvent(type : String, results : Array, bubbles : Boolean = false, cancelable : Boolean = false)
+		{
+			this._results = results;
+			super(type, bubbles, cancelable);
+		}
+		
+				
+		public override function clone() : Event
+		{
+			return new SearchEvent(type, _results, bubbles, cancelable);
+		}
+		
+		public function get results() : Array
+		{
+			return _results;
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bindings/as3/src/org/omras2/audiodb/model/SearchResult.as	Wed Sep 15 11:59:47 2010 +0000
@@ -0,0 +1,69 @@
+package org.omras2.audiodb.model 
+{
+
+	/**
+	 * @author mikej
+	 */
+	public class SearchResult 
+	{
+		private var _uid : String;
+		private var _dist : Number;
+		private var _qpos : Number;
+		private var _ipos : Number;
+		
+		public static function createFromResponse(response : Array) : SearchResult
+		{
+			var searchResult : SearchResult = new SearchResult();
+			searchResult.uid = response[0];
+			searchResult.dist = response[1];
+			searchResult.qpos = response[2];
+			searchResult.ipos = response[3];
+			return searchResult;
+		}
+		
+		public function get uid() : String
+		{
+			return _uid;
+		}
+		
+		public function set uid(uid : String) : void
+		{
+			_uid = uid;
+		}
+		
+		public function get dist() : Number
+		{
+			return _dist;
+		}
+		
+		public function set dist(dist : Number) : void
+		{
+			_dist = dist;
+		}
+		
+		public function get qpos() : Number
+		{
+			return _qpos;
+		}
+		
+		public function set qpos(qpos : Number) : void
+		{
+			_qpos = qpos;
+		}
+		
+		public function get ipos() : Number
+		{
+			return _ipos;
+		}
+		
+		public function set ipos(ipos : Number) : void
+		{
+			_ipos = ipos;
+		}
+		
+		public function toString() : String
+		{
+			return "[SearchResult uid="+uid+" dist="+dist+" qpos="+qpos+" ipos="+ipos+"]";
+		}
+	}
+}
--- a/bindings/as3/src/tests/AllTests.as	Wed Sep 15 11:05:12 2010 +0000
+++ b/bindings/as3/src/tests/AllTests.as	Wed Sep 15 11:59:47 2010 +0000
@@ -14,6 +14,7 @@
 			
 			addTest(new TestQuerier("testLookupSuccess"));
 			addTest(new TestQuerier("testLookupFail"));
+			addTest(new TestQuerier("testSearchSuccess"));
 		}
 	}
 }
--- a/bindings/as3/src/tests/TestQuerier.as	Wed Sep 15 11:05:12 2010 +0000
+++ b/bindings/as3/src/tests/TestQuerier.as	Wed Sep 15 11:59:47 2010 +0000
@@ -4,6 +4,8 @@
 
 	import org.omras2.audiodb.LookupEvent;
 	import org.omras2.audiodb.Querier;
+	import org.omras2.audiodb.SearchEvent;
+	import org.omras2.audiodb.model.SearchResult;
 
 	import flash.events.ErrorEvent;
 
@@ -50,5 +52,21 @@
 			assertEquals(event.track.artist, 'Moscow Drive');
 			assertEquals(event.track.seconds, '221000');
 		}
+		
+		public function testSearchSuccess() : void
+		{
+			var handler : Function = addAsync(handleSearchSuccessComplete, 10000);
+			_querier.addEventListener(SearchEvent.COMPLETE, handler);
+			_querier.search("AWAL1000");
+		}
+		
+		protected function handleSearchSuccessComplete(event : SearchEvent) : void 
+		{
+			assertEquals(20, event.results.length);
+			var firstMatch : SearchResult = (event.results[0] as SearchResult);
+			assertEquals("AWAL1000", firstMatch.uid);
+			assertEquals(0, firstMatch.ipos);
+			assertEquals(0, firstMatch.qpos);
+		}
 	}
 }