Alter granularity in date exposed filter from Y-m to Y if only year is selected
So, I ended up going the very ugly way.

First, my module is now reduced to:

    function lezoo_views_query_alter(&amp;$view, &amp;$query) {
  //If a date was selected in the exposed filter, ignore the default date filter '&gt; today'
  $conditions = $view-&gt;query-&gt;where['1']['conditions'];
  $date_index = 3;
  dpm($conditions);
  if(isset($view-&gt;query-&gt;where['1']['conditions'][$date_index]) &amp;&amp;
    //if a date exposed filter was set
   $view-&gt;query-&gt;where['1']['conditions'][$date_index]['field'] != 'node.nid')
  {
    unset($view-&gt;query-&gt;where['1']['conditions'][2]);
  }
} 


which is needed because the default filter on dates(not exposed) is after today, but if you select a date, then ignore that filter.

And I added a second date_exposed_filter, so that I now have date1->granularity:Y, and date2->granularity:Y-m. I then use css to hide the Y of Y-m, and js to mirror both Year fields. if anyone is interested, here is the code I use:

            var year = $('.views-widget-filter-field_date_value_2 select.date-year');
            var ymonth = $('.views-widget-filter-field_date_value_1 select.date-month');
            var yearm = $('.views-widget-filter-field_date_value_1 select.date-year');

            ymonth.change(function(e){
                var value = $(this).val();
                //var value = e.target.value;
                var empty = value == "";
                if(!empty)
                {
                    yearm.val(year.val()).trigger("chosen:updated");
                }
                else
                {
                    yearm.val("");
                }
            });

            year.change(function(e){
                if(ymonth.val() != '')
                {
                    yearm.val(year.val()).trigger('chosen:updated');
                }
                else
                {
                    month.val('');
                }
            })