public ComputedIndex(DocumentMapping mapping, MemberInfo[] members)
 {
     _members = members;
     var field = mapping.FieldFor(members);
     _locator = field.SqlLocator.Replace("d.", "");
     _table = mapping.Table;
 }
Exemple #2
0
        private IEnumerable<string> buildColumns()
        {
            foreach (var m in _members)
            {
                var field = _mapping.FieldFor(m);
                var casing = Casing;
                if (field.FieldType != typeof(string))
                {
                    // doesn't make sense to lower-case this particular member
                    casing = Casings.Default;
                }

                var sql = field.TypedLocator.Replace("d.", "");
                switch (casing)
                {
                    case Casings.Upper:
                        yield return $"upper({sql})";
                        break;

                    case Casings.Lower:
                        yield return $"lower({sql})";
                        break;

                    default:
                        yield return $"({sql})";
                        break;
                }
            }

            if (TenancyScope == TenancyScope.PerTenant)
            {
                yield return TenantIdColumn.Name;
            }
        }
Exemple #3
0
        public ComputedIndex(DocumentMapping mapping, MemberInfo[][] members)
        {
            _members = members;

            var mebersLocator = members
                                .Select(m =>
            {
                var sql = mapping.FieldFor(m).SqlLocator.Replace("d.", "");
                switch (Casing)
                {
                case Casings.Upper:
                    return($" upper({sql})");

                case Casings.Lower:
                    return($" lower({sql})");

                default:
                    return($" ({sql})");
                }
            })
                                .Join(",");

            _locator = $" {mebersLocator}";

            _table = mapping.Table;
        }
Exemple #4
0
        public ComputedIndex(DocumentMapping mapping, MemberInfo[] members)
        {
            _members = members;
            var field = mapping.FieldFor(members);

            _locator = field.SqlLocator.Replace("d.", "");
            _table   = mapping.Table;
        }
Exemple #5
0
        public string ToDDL()
        {
            var index = IsUnique ? "CREATE UNIQUE INDEX" : "CREATE INDEX";

            if (IsConcurrent)
            {
                index += " CONCURRENTLY";
            }

            index += $" {IndexName} ON {_mapping.Table.QualifiedName}";

            if (Method != IndexMethod.btree)
            {
                index += $" USING {Method}";
            }

            var membersLocator = _members
                                 .Select(m =>
            {
                var sql = _mapping.FieldFor(m).SqlLocator.Replace("d.", "");
                switch (Casing)
                {
                case Casings.Upper:
                    return($" upper({sql})");

                case Casings.Lower:
                    return($" lower({sql})");

                default:
                    return($" ({sql})");
                }
            })
                                 .Join(",");

            var locator = $"{membersLocator}";

            if (TenancyScope == TenancyScope.PerTenant)
            {
                locator = $"{locator}, tenant_id";
            }

            index += " (" + locator + ")";

            // Only the B-tree index type supports modifying the sort order, and ascending is the default
            if (Method == IndexMethod.btree && SortOrder == SortOrder.Desc)
            {
                index  = index.Remove(index.Length - 1);
                index += " DESC)";
            }

            if (Where.IsNotEmpty())
            {
                index += $" WHERE ({Where})";
            }

            return(index + ";");
        }
Exemple #6
0
 public IField FieldFor(IEnumerable <MemberInfo> members)
 {
     return(Parent.FieldFor(members) ?? _inner.FieldFor(members));
 }
        // TODO -- use the mapping off of DocumentQuery later
        public string JsonLocator(DocumentMapping mapping, Expression expression)
        {
            var visitor = new FindMembers();
            visitor.Visit(expression);

            //return new JsonLocatorField(visitor.Members.ToArray()).SqlLocator;

            var field = mapping.FieldFor(visitor.Members);

            _query.RegisterField(field);

            return field.SqlLocator;
        }