-- cette fonction permet d'enlever aleatoirement 20% des
-- tuples afin de rendre la base plus realiste
CREATE OR REPLACE FUNCTION trous_stock() RETURNS bigint as
$$
DECLARE
	stock_total integer;
	echantillon integer;
	vins_disponibles integer;
	contenants_disponibles integer;
	v_vin_id integer;
	v_contenant_id integer;
	v_tuples bigint := 0;
	annee_min integer;
	annee_max integer;
	v_annee integer;
BEGIN

  -- on compte le nombre de tuples dans stock
  select count(*) from stock into stock_total;
  raise NOTICE 'taille du stock %', stock_total;

  -- on calcule la taille de l'echantillon a
  -- supprimer de la table stock
  select round(stock_total/10) into echantillon;
  raise NOTICE 'taille de l''echantillon %', echantillon;

  -- on compte le nombre de vins disponibles
  select count(*) from vin into vins_disponibles;
  raise NOTICE '% vins disponibles', vins_disponibles;

  -- on compte le nombre de contenants disponibles
  select count(*) from contenant into contenants_disponibles;
  raise NOTICE '% contenants disponibles', contenants_disponibles;

  -- on recupere les bornes min/max de annees
  select min(annee), max(annee) 
  from stock
  into annee_min, annee_max;

  -- on fait une boucle correspondant a 1% des tuples 
  -- de la table stock
  for v_tuples in 1 .. echantillon loop
   
     -- selection d'identifiant, au hasard
     --select round(random()*contenants_disponibles) into v_contenant_id;
     v_contenant_id := round(random()*contenants_disponibles);

     --select round(random()*vins_disponibles) into v_vin_id;
     v_vin_id := round(random()*vins_disponibles);

     v_annee := round(random()*(annee_max-annee_min))+(annee_min);
 
     -- si le tuple est deja efface, ce n'est pas grave..
     delete 
     from stock
     where 
           contenant_id = v_contenant_id
       and vin_id = v_vin_id
       and annee  = v_annee;

     if (((v_tuples%100)=0) or (v_tuples=echantillon)) then
       raise notice 'stock : % sur % echantillon effaces',v_tuples, echantillon;
     end if;

  end loop; --fin boucle v_tuples

  RETURN echantillon;

END;
$$ LANGUAGE plpgsql;
