Browse Source

[spod] Allow String ids on relation fields

Cauê Waneck 10 years ago
parent
commit
696dbb870a
3 changed files with 73 additions and 2 deletions
  1. 3 2
      std/sys/db/RecordMacros.hx
  2. 13 0
      tests/unit/src/unit/MySpodClass.hx
  3. 57 0
      tests/unit/src/unit/TestSpod.hx

+ 3 - 2
std/sys/db/RecordMacros.hx

@@ -367,9 +367,10 @@ class RecordMacros {
 					case DId: DInt;
 					case DUId: DUInt;
 					case DBigId: DBigInt;
-					default: throw "Unexpected id type, use either SId, SUId, SBigID";
+					case t = DString(_): t;
+					default: throw "Unexpected id type, use either SId, SUId, SBigID or SString";
 				}
-			
+
 			if( f == null ) {
 				f = {
 					name : r.key,

+ 13 - 0
tests/unit/src/unit/MySpodClass.hx

@@ -68,3 +68,16 @@ abstract AbstractSpodTest<A>(A) from A
 		return this;
 	}
 }
+
+@:id(name)
+@:keep class ClassWithStringId extends Object
+{
+	public var name:SString<255>;
+	public var field:SInt;
+}
+
+@:keep class ClassWithStringIdRef extends Object
+{
+	public var id:SId;
+	@:relation(ref_id) public var ref:ClassWithStringId;
+}

+ 57 - 0
tests/unit/src/unit/TestSpod.hx

@@ -9,6 +9,8 @@ import sys.db.TableCreate;
 import sys.FileSystem;
 import unit.MySpodClass;
 
+using Lambda;
+
 class TestSpod extends Test
 {
 	private var cnx:Connection;
@@ -23,6 +25,8 @@ class TestSpod extends Test
 		TableCreate.create(MySpodClass.manager);
 		TableCreate.create(OtherSpodClass.manager);
 		TableCreate.create(NullableSpodClass.manager);
+		TableCreate.create(ClassWithStringId.manager);
+		TableCreate.create(ClassWithStringIdRef.manager);
 	}
 
 	private function setManager()
@@ -54,6 +58,59 @@ class TestSpod extends Test
 		return scls;
 	}
 
+	public function testStringIdRel()
+	{
+		setManager();
+		var s = new ClassWithStringId();
+		s.name = "first";
+		s.field = 1;
+		s.insert();
+		var v1 = new ClassWithStringIdRef();
+		v1.ref = s;
+		v1.insert();
+		var v2 = new ClassWithStringIdRef();
+		v2.ref = s;
+		v2.insert();
+
+		s = new ClassWithStringId();
+		s.name = "second";
+		s.field = 2;
+		s.insert();
+		v1 = new ClassWithStringIdRef();
+		v1.ref = s;
+		v1.insert();
+		s = null; v1 = null; v2 = null;
+		Manager.cleanup();
+
+		var first = ClassWithStringId.manager.search($name == "first");
+		eq(first.length,1);
+		var first = first.first();
+		eq(first.field,1);
+		var frel = ClassWithStringIdRef.manager.search($ref == first);
+		eq(frel.length,2);
+		for (rel in frel)
+			eq(rel.ref, first);
+		var frel2 = ClassWithStringIdRef.manager.search($ref_id == "first");
+		eq(frel2.length,2);
+		for (rel in frel2)
+			eq(rel.ref, first);
+
+		var second = ClassWithStringId.manager.search($name == "second");
+		eq(second.length,1);
+		var second = second.first();
+		eq(second.field,2);
+		var srel = ClassWithStringIdRef.manager.search($ref == second);
+		eq(srel.length,1);
+		for (rel in srel)
+			eq(rel.ref, second);
+
+		eq(frel.array().indexOf(srel.first()), -1);
+		second.delete();
+		for (r in srel) r.delete();
+		first.delete();
+		for (r in frel) r.delete();
+	}
+
 	public function testEnum()
 	{
 		setManager();