public void CreateATable()
        {
            var justAnId = new List<FieldConfig> { new FieldConfig("Id", null) };
            var table = new OracularTable ("foobar", null, null, justAnId);

            Assert.AreEqual ("foobar", table.Table);

            var fields = table.Fields.ToArray ();

            Assert.That (fields, Has.Length.EqualTo (1));
            Assert.AreEqual ("Id", fields[0].Name);
        }
        public void CreateParentRelationship()
        {
            var idAndOwner = new List<FieldConfig>
            {
                new FieldConfig("Id", null),
                new FieldConfig("OwnerId", null)
            };
            var ownerRelationship = new List<ParentConfig>
            {
                new ParentConfig("Owner", null, null)
            };
            var table = new OracularTable ("Account", null, ownerRelationship, idAndOwner);

            var parents = table.Parents.ToArray ();

            Assert.That (parents, Has.Length.EqualTo (1));
            Assert.AreEqual ("Owner", parents [0].Name);
        }
        public void DefaultParentFields()
        {
            var idAndAccountId = new List<FieldConfig>
            {
                new FieldConfig("Id", null),
                new FieldConfig("AccountId", null)
            };
            var ownerRelationship = new List<ParentConfig>
            {
                new ParentConfig("Account", null, null)
            };
            var table = new OracularTable ("Order", null, ownerRelationship, idAndAccountId);

            var parents = table.Parents.ToArray ();

            Assert.That (parents, Has.Length.EqualTo (1));

            var account = parents [0];
            Assert.AreEqual ("Account", account.Name);
            Assert.AreEqual ("AccountId", account.Id);
            Assert.AreEqual ("Account", account.Table);
        }
        public void DefaultTypeToString()
        {
            var idAndTestField = new List<FieldConfig> {
                new FieldConfig("Id", null),
                new FieldConfig("Test", null)
            };
            var table = new OracularTable ("foobar", null, null, idAndTestField);

            FieldConfig testField = null;
            foreach (var field in table.Fields)
            {
                if (field.Name == "Test")
                {
                    testField = field;
                    break;
                }
            }
            Assert.NotNull (testField);
            Assert.AreEqual (FieldType.String, testField.Type);
        }
 public abstract BuiltinExpansion ExpandMacro(OracularConfig config, OracularTable parent, OracularTable child, Reference reference, AstNode nestedSpec);
        public override BuiltinExpansion ExpandMacro(OracularConfig config, OracularTable parent, OracularTable child, Reference reference, AstNode nestedSpec)
        {
            var withTable = String.Format ("Annotated{0}{1}", parent.Table, nestedSpec.Id);

            var relationship = child.GetRelationshipTo (parent.Table);
            if (relationship == null)
            {
                var message = String.Format ("unable to find relationship from {0} to {1}", child.Table, parent.Table);
                throw new OracularException (message);
            }

            var mainJoin = String.Format ("LEFT JOIN [{0}] ON [{0}].[{1}] = [{2}].[{3}]",
                withTable,
                parent.Id,
                parent.Table,
                parent.Id
            );

            var macroField = String.Format ("{0}{1}{2}", Name, child.Table, nestedSpec.Id);

            var builder = new Sqlizer (child, config);

            var nestedWhere = nestedSpec == null ? "" : String.Format("\nWHERE {0}",
                (invertNested ? nestedSpec.Invert() : nestedSpec).Walk(builder)
            );

            var nestedJoins = builder.JoinTables.Count() == 0 ? "" : "\n" + String.Join("\n",
                builder.JoinTables
            );

            var nestedQuery = String.Format (@"[{0}] AS (
            SELECT DISTINCT [{1}].[{2}], 1 [{3}]
            FROM [{1}]
            LEFT JOIN [{4}] ON [{4}].[{5}] = [{1}].[{2}]{6}{7}
            )", withTable, parent.Table, parent.Id, macroField, child.Table, relationship.Id, nestedJoins, nestedWhere);

            var expansion = new BuiltinExpansion ();

            expansion.With.AddRange (builder.CommonTableExpressions);

            expansion.With.Add (nestedQuery);
            expansion.Join.Add (mainJoin);

            expansion.Where = String.Format ("[{0}].[{1}]{2}", withTable, macroField, suffix);

            return expansion;
        }