Exemplo n.º 1
0
        public void MainTest()
        {
            Key key;

            using (var session = Domain.OpenSession()) {
                using (var t = session.OpenTransaction()) {
                    Book book = new Book {
                        Title = "Title", Text = "Text"
                    };
                    key = book.Key;
                    Session.Current.SaveChanges();
                    t.Complete();
                }
            }
            using (var session = Domain.OpenSession()) {
                using (session.OpenTransaction()) {
                    EntityState state = Session.Current.EntityStateCache[key, true];
                    Assert.IsNull(state);
                    IndexInfo ii = Domain.Model.Types[typeof(Book)].Indexes.PrimaryIndex;

                    var parameterContext = new ParameterContext();
                    // Select *
                    CompilableProvider rsMain = ii.GetQuery();
                    UpdateCache(session, rsMain.GetRecordSetReader(session, parameterContext));
                    state = Session.Current.EntityStateCache[key, true];
                    Assert.IsNotNull(state);
                    Assert.IsTrue(state.Tuple.GetFieldState(2).IsAvailable());
                    Assert.IsTrue(state.Tuple.GetFieldState(3).IsAvailable());
                    ResetState(state);

                    // Select Id, TypeId, Title
                    CompilableProvider rsTitle = rsMain.Select(0, 1, 2);
                    UpdateCache(session, rsTitle.GetRecordSetReader(session, parameterContext));
                    state = Session.Current.EntityStateCache[key, true];
                    Assert.IsNotNull(state);
                    Assert.IsTrue(state.Tuple.GetFieldState(2).IsAvailable());
                    Assert.IsFalse(state.Tuple.GetFieldState(3).IsAvailable());
                    ResetState(state);

                    // Select Id, TypeId, Text
                    CompilableProvider rsText = rsMain.Select(0, 1, 3);
                    UpdateCache(session, rsText.GetRecordSetReader(session, parameterContext));
                    state = Session.Current.EntityStateCache[key, true];
                    Assert.IsNotNull(state);
                    Assert.IsFalse(state.Tuple.GetFieldState(2).IsAvailable());
                    Assert.IsTrue(state.Tuple.GetFieldState(3).IsAvailable());
                    ResetState(state);

                    // Select a.Id, a.TypeId, a.Title, b.Id, b.TypeId, b.Text
                    CompilableProvider rsJoin = rsTitle.Alias("a").Join(rsText.Alias("b"), new Pair <int>(0, 0), new Pair <int>(1, 1));
                    UpdateCache(session, rsJoin.GetRecordSetReader(session, parameterContext));
                    state = Session.Current.EntityStateCache[key, true];
                    Assert.IsNotNull(state);
                    Assert.IsTrue(state.Tuple.GetFieldState(2).IsAvailable());
                    Assert.IsTrue(state.Tuple.GetFieldState(3).IsAvailable());
                    ResetState(state);
                }
            }
        }
Exemplo n.º 2
0
        private static CompilableProvider CreateQueryForDirectAssociation(Pair <object, CacheKey> pair, IndexInfo primaryTargetIndex, List <int> resultColumns)
        {
            AddResultColumnIndexes(resultColumns, primaryTargetIndex, 0);
            var association    = pair.Second.ReferencingField.Associations.Last();
            var field          = association.Reversed.OwnerField;
            var keyColumnTypes = field.Columns.Select(column => column.ValueType).ToList();

            return(primaryTargetIndex
                   .GetQuery()
                   .Filter(QueryHelper.BuildFilterLambda(field.MappingInfo.Offset, keyColumnTypes, ownerParameter)));
        }
Exemplo n.º 3
0
 /// <inheritdoc/>
 public void Lock(LockMode lockMode, LockBehavior lockBehavior)
 {
     using (new ParameterContext().Activate()) {
         keyParameter.Value = Key.Value;
         object key = new Triplet <TypeInfo, LockMode, LockBehavior>(TypeInfo, lockMode, lockBehavior);
         Func <object, object> generator = tripletObj => {
             var       triplet = (Triplet <TypeInfo, LockMode, LockBehavior>)tripletObj;
             IndexInfo index   = triplet.First.Indexes.PrimaryIndex;
             var       query   = index.GetQuery()
                                 .Seek(() => keyParameter.Value)
                                 .Lock(() => triplet.Second, () => triplet.Third)
                                 .Select();
             return(Session.Compile(query));
         };
         var source    = (ExecutableProvider)Session.StorageNode.InternalQueryCache.GetOrAdd(key, generator);
         var recordSet = source.GetRecordSet(Session);
         recordSet.FirstOrDefault();
     }
 }
Exemplo n.º 4
0
        private static CompilableProvider CreateQueryForAssociationViaAuxType(Pair <object, CacheKey> pair, IndexInfo primaryTargetIndex, List <int> resultColumns)
        {
            var association      = pair.Second.ReferencingField.Associations.Last();
            var associationIndex = association.UnderlyingIndex;
            var joiningColumns   = GetJoiningColumnIndexes(primaryTargetIndex, associationIndex,
                                                           association.AuxiliaryType != null);

            AddResultColumnIndexes(resultColumns, associationIndex, 0);
            AddResultColumnIndexes(resultColumns, primaryTargetIndex, resultColumns.Count);
            var firstKeyColumnIndex = associationIndex.Columns.IndexOf(associationIndex.KeyColumns[0].Key);
            var keyColumnTypes      = associationIndex
                                      .Columns
                                      .Skip(firstKeyColumnIndex)
                                      .Take(associationIndex.KeyColumns.Count)
                                      .Select(column => column.ValueType)
                                      .ToList();

            return(associationIndex.GetQuery()
                   .Filter(QueryHelper.BuildFilterLambda(firstKeyColumnIndex, keyColumnTypes, ownerParameter))
                   .Alias("a")
                   .Join(primaryTargetIndex.GetQuery(), joiningColumns));
        }