company.erl

来自「OTP是开放电信平台的简称」· ERL 代码 · 共 374 行

ERL
374
字号
%% ``The contents of this file are subject to the Erlang Public License,%% Version 1.1, (the "License"); you may not use this file except in%% compliance with the License. You should have received a copy of the%% Erlang Public License along with this software. If not, it can be%% retrieved via the world wide web at http://www.erlang.org/.%% %% Software distributed under the License is distributed on an "AS IS"%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See%% the License for the specific language governing rights and limitations%% under the License.%% %% The Initial Developer of the Original Code is Ericsson Utvecklings AB.%% Portions created by Ericsson are Copyright 1999, Ericsson Utvecklings%% AB. All Rights Reserved.''%% %%     $Id$%%-module(company).-compile(export_all).%0-include_lib("stdlib/include/qlc.hrl").-include("company.hrl").init() ->    mnesia:create_table(employee,                        [{attributes, record_info(fields, employee)}]),    mnesia:create_table(dept,                        [{attributes, record_info(fields, dept)}]),    mnesia:create_table(project,                        [{attributes, record_info(fields, project)}]),    mnesia:create_table(manager, [{type, bag},                                   {attributes, record_info(fields, manager)}]),    mnesia:create_table(at_dep,                         [{attributes, record_info(fields, at_dep)}]),    mnesia:create_table(in_proj, [{type, bag},                                   {attributes, record_info(fields, in_proj)}]).%0    %1insert_emp(Emp, DeptId, ProjNames) ->    Ename = Emp#employee.name,    Fun = fun() ->                  mnesia:write(Emp),                  AtDep = #at_dep{emp = Ename, dept_id = DeptId},                  mnesia:write(AtDep),                  mk_projs(Ename, ProjNames)          end,    mnesia:transaction(Fun).mk_projs(Ename, [ProjName|Tail]) ->    mnesia:write(#in_proj{emp = Ename, proj_name = ProjName}),    mk_projs(Ename, Tail);mk_projs(_, []) -> ok.    %1%2females() ->    F = fun() ->		Q = qlc:q([E#employee.name || E <- mnesia:table(employee),					      E#employee.sex == female]),		qlc:e(Q)	end,    mnesia:transaction(F).%2%20all_females() ->    F = fun() ->		Female = #employee{sex = female, name = '$1', _ = '_'},		mnesia:select(employee, [{Female, [], ['$1']}])        end,    mnesia:transaction(F).%20g() -> l.%3female_bosses() ->    Q = qlc:q( [{E#employee.name, Boss#employee.name} ||		   E <- mnesia:table(employee),		   Boss <- mnesia:table(employee),		   Atdep <- mnesia:table(at_dep),		   Mgr <- mnesia:table(manager),		   E#employee.sex == female,		   Atdep#at_dep.emp == E#employee.emp_no,		   Mgr#manager.emp == Boss#employee.emp_no,		   Atdep#at_dep.dept_id == Mgr#manager.dept]	      ),    mnesia:transaction(fun() -> qlc:e(Q) end).%3%4raise_females(Amount) ->    F = fun() ->                Q = qlc:q([E || E <- mnesia:table(employee),                                E#employee.sex == female]),		Fs = qlc:e(Q),                over_write(Fs, Amount)        end,    mnesia:transaction(F).over_write([E|Tail], Amount) ->    Salary = E#employee.salary + Amount,    New = E#employee{salary = Salary},    mnesia:write(New),    1 + over_write(Tail, Amount);over_write([], _) ->    0.%4%5raise(Eno, Raise) ->    F = fun() ->                [E] = mnesia:read(employee, Eno, write),                Salary = E#employee.salary + Raise,                New = E#employee{salary = Salary},                mnesia:write(New)        end,    mnesia:transaction(F).%5%6bad_raise(Eno, Raise) ->    F = fun() ->                [E] = mnesia:read({employee, Eno}),                Salary = E#employee.salary + Raise,                New = E#employee{salary = Salary},                io:format("Trying to write ... ~n", []),                mnesia:write(New)        end,    mnesia:transaction(F).%6                       %9get_emps(Salary, Dep) ->    Q = qlc:q(           [E || E <- mnesia:table(employee),                At <- mnesia:table(at_dep),                E#employee.salary > Salary,                E#employee.emp_no == At#at_dep.emp,                At#at_dep.dept_id == Dep]	 ),    F = fun() -> qlc:e(Q) end,    mnesia:transaction(F).%9%10get_emps2(Salary, Dep) ->    Epat = mnesia:table_info(employee, wild_pattern),    Apat = mnesia:table_info(at_dep, wild_pattern),    F = fun() ->                All = mnesia:match_object(Epat),                High = filter(All, Salary),                Alldeps = mnesia:match_object(Apat),                filter_deps(High, Alldeps, Dep)        end,    mnesia:transaction(F).                filter([E|Tail], Salary) ->    if         E#employee.salary > Salary ->            [E | filter(Tail, Salary)];        true ->            filter(Tail, Salary)    end;filter([], _) ->    [].filter_deps([E|Tail], Deps, Dep) ->    case search_deps(E#employee.name, Deps, Dep) of        true ->            [E | filter_deps(Tail, Deps, Dep)];        false ->            filter_deps(Tail, Deps, Dep)    end;filter_deps([], _,_) ->     [].search_deps(Name, [D|Tail], Dep) ->    if        D#at_dep.emp == Name,        D#at_dep.dept_id == Dep -> true;        true -> search_deps(Name, Tail, Dep)    end;search_deps(_Name, _Tail, _Dep) ->    false.%10                %11bench1() ->    Me = #employee{emp_no= 104732,               name = klacke,               salary = 7,               sex = male,               phone = 99586,               room_no = {221, 015}},        F = fun() -> insert_emp(Me, 'B/DUR', [erlang, mnesia, otp]) end,    T1 = timer:tc(company, dotimes, [1000, F]),    mnesia:add_table_copy(employee, b@skeppet, ram_copies),    mnesia:add_table_copy(at_dep, b@skeppet, ram_copies),    mnesia:add_table_copy(in_proj, b@skeppet, ram_copies),    T2 = timer:tc(company, dotimes, [1000, F]),    {T1, T2}.dotimes(0, _) ->    ok;dotimes(I, F) ->    F(), dotimes(I-1, F).%11                        %12dist_init() ->    mnesia:create_table(employee,                         [{ram_copies, [a@gin, b@skeppet]},                          {attributes, record_info(fields,						   employee)}]),    mnesia:create_table(dept,                         [{ram_copies, [a@gin, b@skeppet]},                          {attributes, record_info(fields, dept)}]),    mnesia:create_table(project,                         [{ram_copies, [a@gin, b@skeppet]},                          {attributes, record_info(fields, project)}]),    mnesia:create_table(manager, [{type, bag},                                   {ram_copies, [a@gin, b@skeppet]},                                  {attributes, record_info(fields,							   manager)}]),    mnesia:create_table(at_dep,                         [{ram_copies, [a@gin, b@skeppet]},                          {attributes, record_info(fields, at_dep)}]),    mnesia:create_table(in_proj,                        [{type, bag},                          {ram_copies, [a@gin, b@skeppet]},                         {attributes, record_info(fields, in_proj)}]).%12%13remove_proj(ProjName) ->    F = fun() ->                Ip = qlc:e(qlc:q([X || X <- mnesia:table(in_proj),				       X#in_proj.proj_name == ProjName]				)),                mnesia:delete({project, ProjName}),                del_in_projs(Ip)        end,    mnesia:transaction(F).del_in_projs([Ip|Tail]) ->    mnesia:delete_object(Ip),    del_in_projs(Tail);del_in_projs([]) ->    done.%13        %14sync() ->    case mnesia:wait_for_tables(tabs(), 10000) of        {timeout, RemainingTabs} ->            panic(RemainingTabs);        ok ->            synced    end.tabs() -> [employee, dept, project, at_dep, in_proj, manager].%14find_male_on_second_floor() ->    Select = fun() ->%21      MatchHead = #employee{name='$1', sex=male, room_no={'$2', '_'}, _='_'},      Guard = [{'>=', '$2', 220},{'<', '$2', 230}],      Result = '$1',      mnesia:select(employee,[{MatchHead, Guard, [Result]}])%21    end,    mnesia:transaction(Select).panic(X) -> exit({panic, X}).fill_tables() ->    Emps =         [	 {employee, 104465, "Johnson Torbjorn",   1, male, 99184, {242,038}},	 {employee, 107912, "Carlsson Tuula",     2, female,94556, {242,056}},	 {employee, 114872, "Dacker Bjarne",      3, male, 99415, {221,035}},	 {employee, 104531, "Nilsson Hans",       3, male, 99495, {222,026}},	 {employee, 104659, "Tornkvist Torbjorn", 2, male, 99514, {222,022}},	 {employee, 104732, "Wikstrom Claes",     2, male, 99586, {221,015}},	 {employee, 117716, "Fedoriw Anna",       1, female,99143, {221,031}},	 {employee, 115018, "Mattsson Hakan",     3, male, 99251, {203,348}}        ],    Dept = [	    {dept, 'B/SF',  "Open Telecom Platform"},	    {dept, 'B/SFP', "OTP - Product Development"},	    {dept, 'B/SFR', "Computer Science Laboratory"}	   ],    Projects = [		{project, erlang, 1},		{project, otp, 2},		{project, beam, 3},		{project, mnesia, 5},		{project, wolf, 6},		{project, documentation, 7},		{project, www, 8}	       ],    Manager = [	       {manager, 104465, 'B/SF'},	       {manager, 104465, 'B/SFP'},	       {manager, 114872, 'B/SFR'}	      ],    At_dep = [	      {at_dep, 104465, 'B/SF'},	      {at_dep, 107912, 'B/SF'},	      {at_dep, 114872, 'B/SFR'},	      {at_dep, 104531, 'B/SFR'},	      {at_dep, 104659, 'B/SFR'},	      {at_dep, 104732, 'B/SFR'},	      {at_dep, 117716, 'B/SFP'},	      {at_dep, 115018, 'B/SFP'}	     ],    In_proj = [	       {in_proj, 104465, otp},	       {in_proj, 107912, otp},	       {in_proj, 114872, otp},	       {in_proj, 104531, otp},	       {in_proj, 104531, mnesia},	       {in_proj, 104545, wolf},	       {in_proj, 104659, otp},	       {in_proj, 104659, wolf},	       {in_proj, 104732, otp},	       {in_proj, 104732, mnesia},	       {in_proj, 104732, erlang},	       {in_proj, 117716, otp},	       {in_proj, 117716, documentation},	       {in_proj, 115018, otp},	       {in_proj, 115018, mnesia}	      ],        [mnesia:dirty_write(W) || W <- Emps],    [mnesia:dirty_write(W) || W <- Dept],    [mnesia:dirty_write(W) || W <- Projects],    %% Relations    [mnesia:dirty_write(W) || W <- Manager],    [mnesia:dirty_write(W) || W <- At_dep],    [mnesia:dirty_write(W) || W <- In_proj],        ok.

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?