From: Matthew DeVore <matvore@comcast.net>
To: Jeff Hostetler <git@jeffhostetler.com>
Cc: Matthew DeVore <matvore@google.com>,
jonathantanmy@google.com, jrn@google.com, git@vger.kernel.org,
dstolee@microsoft.com, jeffhost@microsoft.com,
jrnieder@gmail.com, pclouds@gmail.com
Subject: Re: [PATCH v1 3/5] list-objects-filter: implement composite filters
Date: Fri, 31 May 2019 17:11:26 -0700 [thread overview]
Message-ID: <20190601001126.GE4641@comcast.net> (raw)
In-Reply-To: <2b47d4b1-ea62-d59e-77e0-d95dfad084e0@jeffhostetler.com>
On Fri, May 24, 2019 at 05:01:15PM -0400, Jeff Hostetler wrote:
> We are allowing an unlimited number of filters in the composition.
> In the code, the compose filter data has space for a LHS and RHS, so
> I'm assuming we're mapping
>
> --filter=f1 --filter=f2 --filter=f3 --filter=f4
> or --filter=combine:f1+f2+f3+f4
> into basically
> (compose f1 (compose f2 (compose (f3 f4)))
>
> I wonder if it would be easier to understand if we just built an array
> or linked list, but I'll read on.
As I mentioned in earlier messages, I have changed this to use an array. It's
nicer now.
(nit: the filters were left-associative rather than right-associative)
> Should we swap the order of the terms in the || so that we always
> clear the d->sub[i].is_skipping_tree on LOFS_END_TREE ?
>
Done, and added a comment:
/*
* Check should_delegate before oidset_contains so that
* is_skipping_tree gets unset even when the object is marked as seen.
* As of this writing, no filter uses LOFR_MARK_SEEN on trees that also
* uses LOFR_SKIP_TREE, so the ordering is only theoretically
* important. Be cautious if you change the order of the below checks
* and more filters have been added!
*/
>
> > + result[i] = LOFR_ZERO;
> > + continue;
> > + }
> > +
> > + result[i] = d->sub[i].ctx.filter_fn(
> > + r, filter_situation, obj, pathname, filename,
> > + &d->sub[i].ctx);
> > +
> > + if (result[i] & LOFR_MARK_SEEN)
> > + oidset_insert(&d->sub[i].seen, &obj->oid);
>
> So filter[i] has said it never wants to show this object (hard omit).
> And the guard at the top of the loop will prevent future invocations
> from checking it again if the object is revisited.
>
Yes.
> > +
> > + if (result[i] & LOFR_SKIP_TREE) {
> > + d->sub[i].is_skipping_tree = 1;
> > + d->sub[i].skip_tree = obj->oid;
>
> So this marks the tree object at the top of the skip as far as
> filter[i] is concerned.
>
Yes.
> > + }
> > + }
> > +
> > + if ((result[0] & LOFR_DO_SHOW) && (result[1] & LOFR_DO_SHOW))
> > + combined_result |= LOFR_DO_SHOW;
> > + if (d->sub[0].is_skipping_tree && d->sub[1].is_skipping_tree)
> > + combined_result |= LOFR_SKIP_TREE;
>
> Something about the above bothers me, but I can't quite say what
> it is.
>
It looks nicer now that it's array-based. Let me know what you think after I
send the next roll-up.
> Do we need to do:
> if ((result[0] & LOFR_MARK_SEEN) && (result[1] & LOFR_MARK_SEEN))
> combined_result |= LOFR_MARK_SEEN;
This should be a O(1) sort of optimization, since if we don't set it, the top
filter will still be called, but won't delegate to any sub-filters. It doesn't
complicate the code much, so it seems worth it to add. Done.
> I'm out of time now, will pick this up again next week.
Thank you for taking a look and for your patience so far.
next prev parent reply other threads:[~2019-06-01 0:11 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-05-22 0:21 [PATCH v1 0/5] Filter combination Matthew DeVore
2019-05-22 0:21 ` [PATCH v1 1/5] list-objects-filter: refactor into a context struct Matthew DeVore
2019-05-24 0:49 ` Emily Shaffer
2019-05-28 18:48 ` Matthew DeVore
2019-05-28 22:40 ` [PATCH] list-objects-filter: merge filter data structs Matthew DeVore
2019-05-29 19:48 ` Junio C Hamano
2019-05-29 20:57 ` Jeff Hostetler
2019-05-29 23:10 ` Matthew DeVore
2019-05-30 1:56 ` [RFC PATCH v2] " Matthew DeVore
2019-05-30 16:12 ` Junio C Hamano
2019-05-30 18:29 ` Matthew DeVore
2019-05-30 19:05 ` [PATCH] " Matthew DeVore
2019-05-22 0:21 ` [PATCH v1 2/5] list-objects-filter-options: error is localizeable Matthew DeVore
2019-05-24 0:55 ` Emily Shaffer
2019-05-28 23:01 ` Matthew DeVore
2019-05-22 0:21 ` [PATCH v1 3/5] list-objects-filter: implement composite filters Matthew DeVore
2019-05-24 21:01 ` Jeff Hostetler
2019-05-28 17:59 ` Junio C Hamano
2019-05-29 15:02 ` Matthew DeVore
2019-05-29 21:29 ` Jeff Hostetler
2019-05-29 23:27 ` Matthew DeVore
2019-05-30 14:01 ` Jeff Hostetler
2019-05-31 20:53 ` Matthew DeVore
2019-06-03 21:04 ` Jeff Hostetler
2019-06-01 0:11 ` Matthew DeVore [this message]
2019-05-28 21:53 ` Emily Shaffer
2019-05-31 20:48 ` Matthew DeVore
2019-05-31 21:10 ` Jeff King
2019-06-01 0:12 ` Matthew DeVore
2019-06-03 12:34 ` Jeff King
2019-06-03 22:22 ` Matthew DeVore
2019-06-04 16:13 ` Jeff King
2019-06-04 17:19 ` Matthew DeVore
2019-06-04 18:51 ` Jeff King
2019-06-04 22:59 ` Matthew DeVore
2019-06-04 23:14 ` Jeff King
2019-06-04 23:49 ` Matthew DeVore
2019-06-09 12:36 ` Jeff King
2019-05-22 0:21 ` [PATCH v1 4/5] list-objects-filter-options: move error check up Matthew DeVore
2019-05-22 0:21 ` [PATCH v1 5/5] list-objects-filter-options: allow mult. --filter Matthew DeVore
2019-06-06 22:44 ` [PATCH v1 0/5] Filter combination Matthew DeVore
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20190601001126.GE4641@comcast.net \
--to=matvore@comcast.net \
--cc=dstolee@microsoft.com \
--cc=git@jeffhostetler.com \
--cc=git@vger.kernel.org \
--cc=jeffhost@microsoft.com \
--cc=jonathantanmy@google.com \
--cc=jrn@google.com \
--cc=jrnieder@gmail.com \
--cc=matvore@google.com \
--cc=pclouds@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.